5

我想要一个始终绑定到当前焦点控件的属性。

我已经看到了两种获得当前集中控制的方法。

一种是使用 Keyboard.FocusedElement。第二个是遍历可视化树。

因为我想知道每次聚焦元素发生变化时,可视化树遍历似乎一直在运行大量代码。

但是 Keyboard.FocusedElement 没有实现 INotifyPropertyChanged。所以我不能只是正常绑定它。

有没有办法让它在它发生变化时通知我?

(或者以其他方式让属性始终设置为当前聚焦的控件?)

注意:显然我可以在每个控件上添加一个事件并让它更新一个属性。但是我有很多控制。我想避免必须为每个事件附加一个事件。

4

1 回答 1

6

您可以尝试订阅Keyboard.GotKeyboardFocus 附加事件

当元素获得键盘焦点时发生。

这是一个订阅此事件 OnStartup 的示例。例如,您可以使用附加行为来执行此操作并更新您可以绑定到的附加属性。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        EventManager.RegisterClassHandler(typeof(UIElement),
            Keyboard.GotKeyboardFocusEvent,
            new RoutedEventHandler(Keyboard_GotKeyboardFocus), true);

        base.OnStartup(e);
    }

    private void Keyboard_GotKeyboardFocus(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine(e.OriginalSource);
    }
}
于 2012-07-06T17:49:08.947 回答