TextBox的全局事件处理程序通过鼠标单击获得焦点

时间:2015-03-10 07:23:17

标签: c# wpf

我有一种情况,当我想检测应用程序中任何位置的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>

2 个答案:

答案 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事件。