我正在尝试从viewmodel设置某个UIElement依赖项对象的焦点,为此我编写了一个附加的依赖项属性,如下所示:
#region IsFocusedProperty
public static readonly DependencyProperty IsFocusedProperty =
DependencyProperty.RegisterAttached("IsFocused", typeof(bool), typeof(AttachedProperties),
new FrameworkPropertyMetadata(false,
new PropertyChangedCallback(OnIsFocusedChanged)));
private static void OnIsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var obj = d as UIElement;
var oldValue = (bool)e.OldValue;
var newValue = (bool)e.NewValue;
if (oldValue != newValue && !obj.IsFocused)
{
obj.Focus();
}
}
public static void SetIsFoused(UIElement element, bool value)
{
element.SetValue(IsFocusedProperty, value);
}
public static bool GetIsFocused(UIElement element)
{
return (bool)element.GetValue(IsFocusedProperty);
}
#endregion
我应该说它有效并将焦点发送到指定的元素,除非我将鼠标光标移动到视图中的每个元素上(包括焦点所在的指定元素),否则不会触发鼠标事件。我这样说是因为我已经为元素的IsMouseOverProperty编写了触发器,但是当焦点以这种方式发送到指定的元素时,就会发生这种情况。
我还应该说当我点击视图上的任何地方时触发器再次正常工作。我真的不知道问题是什么?请分享您的想法。任何想法将不胜感激。提前谢谢。
修改: 我已经发现元素接收键盘焦点但显然不是逻辑焦点,因为当我将光标移动到前一个元素时,它仍然会触发MouseMove事件。
我还不确定问题是什么?
答案 0 :(得分:0)
更新至:
if (oldValue != newValue && !obj.IsFocused)
{
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate()
{
obj.Focus();
Keyboard.Focus(obj);
})
);
}