我有一种情况,当我想检测应用程序中任何位置的TextBox何时被用户用鼠标点击或触摸时聚焦。我已经解决了#34;通过添加如下全局事件处理程序:
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,它将处理它并获得关注。这使得上面的方法毫无结果,因为TextBox在这种情况下不会是e.OriginalSource,我发现没有办法确定TextBox是通过点击引起聚焦的。
例如,派生TextBox并覆盖OnMouseDown将捕获此事件,我想可以探索此路径以找到问题的解决方案,但这需要我在任何地方使用自定义TextBox。
那里的人有一个很好的解决方案吗?
这是一个会触发问题的示例。通过单击TextBoxes的边缘,网格将处理鼠标事件,焦点将传递给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>
答案 0 :(得分:1)
GotMouseCapture
事件似乎有效:
AddHandler(UIElement.GotMouseCaptureEvent,
new MouseEventHandler(OnGotMouseCapture), true);
...
void OnGotMouseCapture(object sender, MouseEventArgs e)
{
if (e.OriginalSource is TextBox)
{
// ...
}
}
当我用鼠标点击 TextBox 元素时会触发此事件处理程序,但是通过键盘进行的焦点更改不会触发事件。
答案 1 :(得分:0)
只需处理每个TextBox的GotFocus
事件。