0

子コントロールのすべてGotFocus/イベントを処理する WPF UserControl を作成しました。の/をLostFocus呼び出しますが、UserControlのプロパティは設定されません。OnGotFocusOnLostFocusUserControlIsFocused

void MyUserControl_Initialized(object sender, EventArgs e)
{
    foreach (UIElement control in (Content as Panel).Children)
    {
        control.LostFocus += control_LostFocus;
        control.GotFocus += control_GotFocus;
    }
}

void control_GotFocus(object sender, RoutedEventArgs e)
{
    if (!IsFocused)
    {
        e.Handled = false;
        OnGotFocus(e);
    }
}

void control_LostFocus(object sender, RoutedEventArgs e)
{
    bool hasAnythingTheFocus = false;

    foreach (UIElement control in (Content as Panel).Children)
    {
        if (control.IsFocused)
        {
            hasAnythingTheFocus = true;
        }
    }

    if (!hasAnythingTheFocus)
    {
        OnLostFocus(e);
    }
}

どうすれば設定できますか?

4

3 に答える 3

3

イベントUIElement.IsKeyboardFocusWithinChangedを使用すると、完全に機能するはずです。

于 2013-11-04T11:05:32.967 に答える
0

メソッドはGotFocus、関連するコントロールが論理フォーカスを受け取ると呼び出されます... MSDN のUIElement.GotFocusイベントページから:

メソッド呼び出しを使用してフォーカスが意図的に強制されているが、以前のキーボード フォーカスが別のスコープに存在する場合、論理フォーカスはキーボード フォーカスとは異なります。このシナリオでは、キーボード フォーカスはそのまま残り、Focus メソッドが呼び出された要素は引き続き論理フォーカスを取得します。

このイベントのより正確な解釈は、ルート内の要素の IsFocused プロパティの値が false から true に変更されたときに発生するというものです。

このイベントはバブリング ルーティングを使用するため、フォーカスを受け取る要素は、イベント ハンドラーが実際にアタッチされている要素ではなく、子要素である可能性があります。イベント データのソースを確認して、フォーカスを取得した実際の要素を特定します。ユーザーが UI で関連するコントロールをクリックしたとき、および/またはコードで control.Focus() を呼び出したときにフォーカスを取得します。は設定できませんIsFocusedreadonly

于 2013-11-04T11:06:00.623 に答える