我有一個用戶控件,其中包含多個組合框和按鈕。WPF UserControl GotFocus
在承載UserControl的窗口中,我需要在UserControl獲取焦點時更新某些屬性。
我的問題是,每次當用戶控件中的焦點發生變化時,都會在託管窗口中獲取GotFocus事件。
是否有某種最佳做法可以確保在託管窗口中只有一個GotFocused事件?我的意思是,如果我逐步通過UserControl內的控件,焦點總是在UserControl內部,所以我不需要GotFocused事件。
我有一個用戶控件,其中包含多個組合框和按鈕。WPF UserControl GotFocus
在承載UserControl的窗口中,我需要在UserControl獲取焦點時更新某些屬性。
我的問題是,每次當用戶控件中的焦點發生變化時,都會在託管窗口中獲取GotFocus事件。
是否有某種最佳做法可以確保在託管窗口中只有一個GotFocused事件?我的意思是,如果我逐步通過UserControl內的控件,焦點總是在UserControl內部,所以我不需要GotFocused事件。
這是我走過來解決:
首先這個帖子是我的解決方案的關鍵在於: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。