【发布时间】:2015-03-11 14:54:53
【问题描述】:
我有一种情况,我想检测应用程序中任何地方的文本框何时被用户用鼠标单击或触摸获得焦点。我通过添加这样的全局事件处理程序“解决了”这个问题:
Application.Current.MainWindow.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(txt_MouseLeftButtonUp), true);
...
void txt_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.OriginalSource is TextBox)
{
// Do somthing
}
}
但是,如果用户单击文本框的边缘而不是中间,则宿主控件(网格、边框等)通常会接收鼠标事件并以某种方式将其传递给包含的文本框,由其处理并获得焦点。这使得上述方法徒劳无功,因为在这种情况下 TextBox 将不是 e.OriginalSource ,并且我没有发现任何方法可以确定通过单击使 TextBox 成为焦点。
例如,派生 TextBox 并覆盖 OnMouseDown 将捕获此事件,我想可以探索此路径以找到问题的解决方案,但这需要我在任何地方使用自定义 TextBox。
有人对此有很好的解决方案吗?
这是一个会触发问题的示例。通过单击文本框的边缘,网格将处理鼠标事件,并将焦点传递给文本框。
<Grid>
<Grid HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Red">
<TextBox>2323</TextBox>
</Grid>
<Grid Margin="200,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Red" Focusable="False">
<TextBox>2323</TextBox>
</Grid>
</Grid>
【问题讨论】:
-
如果 TextBox 在没有点击的情况下获得焦点(例如,通过使用 Tab 键),您是否也要检测?
-
好点,只能通过鼠标点击。应忽略 Tab 键焦点。
-
请说明你想用这个做什么,这样更容易提供建议。
-
我想在应用程序中每次单击 TextBox 时调出一个触摸键盘。只有当它被鼠标点击或触摸时。
-
为什么要排除导致焦点的 Tab 键?