2016-05-29 97 views
0

我有一個用戶控件,其中包含多個組合框和按鈕。WPF UserControl GotFocus

在承載UserControl的窗口中,我需要在UserControl獲取焦點時更新某些屬性。

我的問題是,每次當用戶控件中的焦點發生變化時,都會在託管窗口中獲取GotFocus事件。

是否有某種最佳做法可以確保在託管窗口中只有一個GotFocused事件?我的意思是,如果我逐步通過UserControl內的控件,焦點總是在UserControl內部,所以我不需要GotFocused事件。

回答

0

這是我走過來解決:

首先這個帖子是我的解決方案的關鍵在於:WPF UserControl detect LostFocus ignoring children

Refer to active Window in WPF?

使用這些帖子中的函數,我在我的UserControl中註冊了LostFocus事件。

private void UserControl_LostFocus(object sender, RoutedEventArgs e) 
{ 
    var focused_element = FocusManager.GetFocusedElement(Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive)); 
    var parent = (focused_element as FrameworkElement).TryFindParent<KeywordSelector>(); 

    if (parent != this) userControlHasFocus=false; 
} 

然後......

private void UserControl_GotFocus(object sender, RoutedEventArgs e) 
{ 
    if (userControlHasFocus == true) e.Handled = true; 
    else userControlHasFocus = true; 
} 

這樣,我追蹤的焦點。 userControlHasFocus爲false爲默認值。當GotFocus()第一次發生時它是錯誤的,並且GotFocus事件不會從冒泡中停止。但是userControlHasFocus被設置爲true,因爲現在焦點位於UserControl內部。

每當焦點移動到另一個控件時,LostFocus將檢查新控件父項是否爲UserControl。如果不是,則會將userControlHasFocus重置爲false。