文本框的全局事件处理程序通过鼠标单击获取焦点

本文关键字:鼠标 单击 获取焦点 程序 全局 事件处理 文本 | 更新日期: 2024-11-06 18:32:17

我遇到这样一种情况,即我想检测应用程序中任何位置的文本框何时被用户用鼠标单击或触摸而成为焦点。我已经通过添加这样的全局事件处理程序来"解决"这个问题:

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,并且我发现无法识别文本框是通过单击成为焦点的。

例如,派生文本框并覆盖 OnMouseDown 将捕获此事件,我想可以探索此路径以找到解决问题的方法,但这需要我在任何地方使用自定义文本框。

有人

有很好的解决方案吗?

这是一个将触发问题的示例。通过单击文本框的边缘,网格将处理鼠标事件,焦点将传递到文本框。

<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>

文本框的全局事件处理程序通过鼠标单击获取焦点

GotMouseCapture事件似乎有效:

AddHandler(UIElement.GotMouseCaptureEvent,
    new MouseEventHandler(OnGotMouseCapture), true);
...
void OnGotMouseCapture(object sender, MouseEventArgs e)
{
    if (e.OriginalSource is TextBox)
    {
        // ...
    }
}

当我用鼠标单击 TextBox 元素时,将触发此事件处理程序,但是通过键盘进行的焦点更改不会触发该事件。

只需处理每个文本框的GotFocus事件。