2011-08-18 88 views
4

FocusLost事件正在WPF的部件适当地 对于用户控件它是不同的:FocusLost在用户控制[WPF]

如果在用户控件的任何控制被点击或聚焦时,用户控件的FocusLost是立即开火!我怎样才能阻止它?

我解决不了这个问题:(

+0

e.handled = true; –

回答

9

您可以在UserControl检查IsKeyboardFocusWithin以确定其子女的UserControl或任何具有键盘焦点还是不行。还有的事件IsKeyboardFocusWithinChanged,您可以使用,只是检查是否e.OldValuetruee.NewValue是在事件处理程序false

编辑
这里是你如何能够使为例当IsKeyboardFocusWithin变为错误时引发路由事件(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)); 
     } 
    } 
} 
+0

感谢例子和解释:) – icaptan

1

如果你不希望任何火焦点丢失你可以将它添加到XAML用户控件背后的源cs文件:

protected override void OnLostFocus(RoutedEventArgs e) 
{ 
    e.Handled = true; 
}