我正在使用MS Visual Studio 2010中的WPF应用程序制作计算器。我在标准计算器中制作了不同的按钮,并在其上添加了button_Click方法。现在,我还想通过抚摸特定键来执行与button_Click方法相同的任务。
例如
我有“addButton_Click”方法,它执行此操作:
private void addButton_Click(object sender, RoutedEventArgs e)
{
_op = 1;
temp = displayPannel.Text;
check = true;
}
现在如果我想要“+”键在计算器中执行相同操作而不是使用鼠标单击“+”按钮。此外,我也希望使用数字键以及鼠标单击。我该怎么办?
答案 0 :(得分:2)
MainWindow.xaml.cs
private void TextBox_PreviewKeyUp_1(object sender, KeyEventArgs e)
{
if (e.Key == Key.OemPlus || e.Key == Key.Add)
MessageBox.Show("Tada");
}
MainWindow.xaml
<TextBox Text="Hello" PreviewKeyUp="TextBox_PreviewKeyUp_1"/>
答案 1 :(得分:2)
您应该提取执行添加操作的方法。它不是强制性的,但是从handers调用方法是一个很好的做法,而不是在处理程序中有一些大的代码,例如:
private void addButton_Click(object sender, RoutedEventArgs e)
{
PerformAdd();
}
private void PerformAdd()
{
_op = 1;
temp = displayPannel.Text;
check = true;
}
你的实际问题(我在这里假设你想创建类似Windows计算器的东西):
在MainWindow.xaml中附加PreviewKeyDown的处理程序。在你的情况下,最好使用PreviewKeyDown,而不是KeyDown,因为预览事件从“从外到内”,这意味着事件将首先显示在MainWindow处理程序中,然后显示在MainWindow内的控件的处理程序中,而普通事件首先显示在内部类中。首先在MainWindow中捕获事件将允许您全局处理“+”或“ - ”等按键,而不会将它们传递给内部控件。
在处理程序中你应该检查KeyCode,并调用适当的方法,如下所示:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.OemPlus || e.Key == Key.Add)
{
PerformAdd();
e.Handled = true;
}
}
你可以看到e.Handled = true;线。如果将事件标记为已处理,则不会将其传递给内部控件。您应该将其标记为“操作”按键处理,这些按键不应作为输入传递到文本框。
编辑:至于数字,你可以这样做:
if (e.Key == Key.D0 || e.Key == Key.NumPad0)
textBox.Text = textBox.Text + "0";