我问了一个问题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;
}
}
}
}
}