用户控件中的焦点丢失问题 [WPF]

5

FocusLost事件在WPF组件上正常工作。

但对于用户控件,情况有所不同:

如果用户控件中的任何控件被点击或获得焦点,用户控件的FocusLost事件会立即触发!怎么阻止呢?

我无法解决这个问题 :(

2个回答

13
您可以检查UserControl上的IsKeyboardFocusWithin属性,以确定UserControl或其任何子元素是否具有键盘焦点。还有一个事件IsKeyboardFocusWithinChanged,您可以使用它,只需在事件处理程序中检查e.OldValuetruee.NewValuefalse即可。 编辑
这是一个示例,演示如何使UserControlIsKeyboardFocusWithin变为false时引发路由事件(UserControlLostFocus)。
可用方式如下:
<my:UserControl1 UserControlLostFocus="userControl11_UserControlLostFocus"
                 ../>

示例 UserControl

public partial class UserControl1 : UserControl
{
    public static readonly RoutedEvent UserControlLostFocusEvent =
        EventManager.RegisterRoutedEvent("UserControlLostFocus",
                                         RoutingStrategy.Bubble,
                                         typeof(RoutedEventHandler),
                                         typeof(UserControl1));
    public event RoutedEventHandler UserControlLostFocus
    {
        add { AddHandler(UserControlLostFocusEvent, value); }
        remove { RemoveHandler(UserControlLostFocusEvent, value); }
    }

    public UserControl1()
    {
        InitializeComponent();
        this.IsKeyboardFocusWithinChanged += UserControl1_IsKeyboardFocusWithinChanged;
    }

    void UserControl1_IsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.OldValue == true && (bool)e.NewValue == false)
        {
            RaiseEvent(new RoutedEventArgs(UserControl1.UserControlLostFocusEvent, this));
        }
    }
}

1
如果您不希望在失去焦点时触发任何事件,您可以将以下代码添加到 XAML 用户控件后面的源 .CS 文件中:
protected override void OnLostFocus(RoutedEventArgs e)
{
    e.Handled = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接