UWP自定义控件事件订阅要求错误的类型

时间:2018-12-04 04:00:06

标签: c# uwp event-handling custom-controls

我问了一个问题here,并喜欢答案。我创建了一个事件处理程序来实现该解决方案,但是我不想每次使用TextBox时都必须订阅该事件。我的解决方案是制作一个自定义控件,该控件可订阅构造函数中的事件,因此该功能将是默认功能。这行得通,但它打破了其他一些东西。

我更改了其他事件处理程序(条目中的文本验证)以使用参数(TextBox_Custom sender, TextBoxBeforeTextChangingEventArgs e)。当我将“ TextBox”转换为“ TextBox_Custom”时,这些订阅产生了错误。即使我使用的是TextBox_Custom,BeforeTextChanging事件的发件人字段也是TextBox。有什么方法可以使发送方字段成为实际控件类型,而不是继承类型?

这个问题涉及相同的概念,但并没有帮助我回答这个问题。 UWP Template Control with Event Handler

我的解决方案是创建一个可以转换发件人的重载,但这感觉很麻烦,而不是最佳实践。见下文。

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;
                }
            }
        }
    }
}

0 个答案:

没有答案