c# - visual - wpf focus control




WPF-テキストボックスの外側をクリックするときにフォーカスを削除する (7)

私はいくつかのテキストボックスを持っています。ここでは、WPFアプリケーションの場合とは少し違った振る舞いをしたいと思っています。 基本的には、テキストボックスがWebページ上で動作するように動作するようにしたいと思います。 つまり、テキストボックスの外側をクリックすると、フォーカスが失われます。 そうする最善の方法は何ですか?

答えがプログラムでフォーカスを削除するのであれば、枠外のマウスクリックを検出する最も良い方法は何ですか? 私がクリックしている要素がフォーカスの新しい受信者になったらどうなりますか?


IsKeyboardFocusedChangedイベントを使用することができます:

myTextBox.IsKeyboardFocusedChanged += myTextBox_IsKeyboardFocusedChanged;

private void SendFileCaptionTextBox_IsKeyboardFocusedChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (e.NewValue.ToString() == "True")
    {
        // it's focused
    }
    else
    {
        // it's not focused
    }
}    

あなたは明示的にコントロールのフォーカスを失うことはできません

代わりに他のコントロールにフォーカスを設定することができます

**txt.Focusable=true;
label.focus();
Keyboard.Focus(txtPassword);**

これを試して


フォーカスを得ることができる要素をクリックすると、必要なものが得られます。 たとえば、パネルがある場合は、パネルのmouseClickイベントを処理してニーズを満たすことができます。また、Richard Szalayのアドバイスを使用することもできます。


後ろにあるコードを避けるために、この動作を使用することができます。

 public class ClearFocusOnClickBehavior : Behavior<FrameworkElement>
 {
    protected override void OnAttached()
    {
        AssociatedObject.MouseDown += AssociatedObject_MouseDown;
        base.OnAttached();
    }

    private static void AssociatedObject_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        Keyboard.ClearFocus();
    }

    protected override void OnDetaching()
    {
        AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
    }
}

XAMLでの使用:

テキストボックスの外にある任意の要素で、クリックしてフォーカスをクリアするようにします。

    <i:Interaction.Behaviors>
        <behaviors:ClearFocusOnClickBehavior/>
    </i:Interaction.Behaviors>

私は100%確信していませんが、Container要素(Grid、StackPanelなど)でFocusableをtrueに設定した場合は、フォーカスをテキストボックスから離してください。


私は、この問題を解決するより良い方法は、MouseDownイベントハンドラをウィンドウにコードを追加することです:

private void window_MouseDown(object sender, MouseButtonEventArgs e)
{
    Keyboard.ClearFocus();
}

私は同様の問題にぶち当たっていましたが、ScrollViewerコントロールの周りにテキストボックスをラップすると、テクスチャボックスの外のどこかをクリックすると、すべてのテキストボックスが自動的にフォーカスを失います。





click