从视图模型设置焦点不能正常工作

本文关键字:常工作 工作 不能 视图 模型 设置 焦点 | 更新日期: 2023-09-27 18:04:14

我试图从视图模型中设置某个uielelement依赖对象的焦点,为此我编写了一个附加依赖属性,如下所示:

    #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事件。

我还是不确定是什么问题?

从视图模型设置焦点不能正常工作

更新到:

if (oldValue != newValue && !obj.IsFocused)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Input,
        new Action(delegate() 
        { 
            obj.Focus();        
            Keyboard.Focus(obj); 
        })
    );
}