【发布时间】:2011-11-03 09:15:23
【问题描述】:
我有一个包含文本框控件的程序。用户可以在此控件中输入文本。用户还可以按下某些键来触发其他操作(这在 MainWindow 上处理)。我有示例 XAML 和 C# 代码来演示我的设置。
XAML
<Window x:Class="RoutedEventBubbling.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Grid.Row="0" />
<TextBox x:Name="Output" Grid.Row="1" IsReadOnly="True" />
</Grid>
</Window>
C#
using System.Windows;
using System.Windows.Input;
namespace RoutedEventBubbling
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private int mHitCount = 0;
public MainWindow()
{
InitializeComponent();
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
this.Output.Text = string.Format("Hit Count: {0}", ++mHitCount);
}
}
}
您可能已经意识到,在这个程序的情况下,如果我开始输入第一个 TextBox,第二个将被更新为命中计数。这是一个不受欢迎的结果,因为在处理 MainWindow 的 OnKeyDown 方法时,我可能希望触发某些操作。
因此,我的问题是:是否可以防止在 MainWindow 上调用 OnKeyDown 方法,同时仍允许在文本框中输入文本?我知道e.Handled = true 方法,但在这种情况下,在TextBox 的KeyDown 事件上这样做会阻止输入文本。如果这不可能,我将不得不寻找其他方法来处理这一切。
提前致谢。
编辑
我刚刚找到了解决这个问题的一种比较老套的方法。如果我改为处理 MainWindow 的 OnTextInput 方法,那么我想要的结果将得到实现,因为 TextBox 的 TextInput 事件将得到处理。下面是我使用的代码示例:
private Key mPressedKey;
protected override void OnKeyDown(KeyEventArgs e)
{
// Note: This method will be called first.
base.OnKeyDown(e);
// Store the pressed key
mPressedKey = e.Key;
}
protected override void OnTextInput(TextCompositionEventArgs e)
{
// Note: This method will be called second, and only if the textbox hasn't handled it.
base.OnTextInput(e);
this.Output.Text = string.Format("Hit Count: {0}", ++mHitCount);
// ... Handle pressed key ...
}
【问题讨论】:
-
你为什么不用
InputBindings做这种事? -
我刚刚尝试过,它阻止我在文本框中输入内容。
-
哦,没想到,真不幸。
-
e.Handled = true;不会吗?
标签: c# wpf event-bubbling event-routing