我想拥有一个始终绑定到当前焦点控件的属性。
我已经看到了两种获得当前焦点控制的方法。
一个是使用Keyboard.FocusedElement。 第二个是穿越视觉树。
由于我想知道每次聚焦元素发生变化时,可视化树遍历似乎总是会运行大量代码。
但是Keyboard.FocusedElement没有实现INotifyPropertyChanged。所以我不能正常地绑定它。
有没有办法让它在发生变化时让我知道?
(或者其他一些方法可以将属性设置为当前关注的控件?)
注意:显然,我可以在每个控件上添加一个事件,让它更新一个属性。但我有很多控制权。我想避免将事件附加到每个人身上。
答案 0 :(得分:6)
您可以尝试订阅Keyboard.GotKeyboardFocus Attached Event
当元素获得键盘焦点时发生。
以下是订阅此事件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);
}
}