Для подписки на события пользовательского управления UWP требуется неверный тип - PullRequest
0 голосов
/ 04 декабря 2018

Я задал вопрос здесь и мне понравился ответ.Я создал обработчик событий для реализации этого решения, но я не хотел подписываться на это событие при каждом отдельном использовании TextBox.Мое решение состояло в том, чтобы создать пользовательский элемент управления, который подписывается на событие в конструкторе, чтобы функциональность была по умолчанию.Это сработало, но сломало некоторые другие вещи.

Я изменил свои другие обработчики событий (проверка текста в записях), чтобы использовать параметры (TextBox_Custom sender, TextBoxBeforeTextChangingEventArgs e).Когда я конвертировал «TextBox» в «TextBox_Custom's», эти подписки давали ошибки.Несмотря на то, что я использую TextBox_Custom, поле отправителя события BeforeTextChanging является TextBox.Есть ли способ сделать так, чтобы поле отправителя было фактическим типом элемента управления вместо унаследованного типа?

Этот вопрос затрагивал ту же концепцию, но не помог мне ответить на вопрос. Управление шаблонами UWP с обработчиком событий

Мое решение состояло в том, чтобы создать перегрузку, которая преобразует отправителя, но это кажется хакерской и не лучшей практикой.См. Ниже.

EventHandlers:

    // This needs to be assigned in the constructor of the codebehind when used
    public static void IntValidation(TextBox_Custom sender, TextBoxBeforeTextChangingEventArgs e)
    {
        string current_text = sender.Text;
        string proposed_text = e.NewText;

        bool is_int = int.TryParse(proposed_text, out int n);

        if (!is_int && proposed_text != "")
            e.Cancel = true;
    }

    // TextBox_Custom triggers events with the sender being a TextBox still
    public static void IntValidation(TextBox sender, TextBoxBeforeTextChangingEventArgs e)
    {
        IntValidation((TextBox_Custom)sender, e);
    }

Подписка на события:

    public Load_LogSelection()
    {
        this.InitializeComponent();

        Grs_weight_entry.BeforeTextChanging += Helpers.DoubleValidation;
    }

XAML:

<local:TextBox_Custom x:Name="Grs_weight_entry" Text="{x:Bind Path=ViewModel.Grs_weight, Mode=TwoWay}" Grid.Row="2" Grid.Column="2" Width="80"/>

Пользовательский элемент управления:

public partial class TextBox_Custom : TextBox
{
    public TextBox_Custom()
    {
        PreviewKeyDown += PreviewKeyDownEventHandler;
    }

    private void PreviewKeyDownEventHandler(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Down)
        {
            if (sender is TextBox)
            {
                TextBox entry = (TextBox)sender;
                // Entry has text, nothing is selected and cursor is at index 0
                if (entry.Text.Length > 0 && entry.SelectionLength == 0 && entry.SelectionStart == 0)
                {
                    entry.SelectionStart = entry.Text.Length;
                    //entry.SelectionStart = entry.Text.Length -1;
                    entry.SelectionLength = 0;
                    e.Handled = true;
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...