17

いくつかのテキスト ボックスを含む WPF フォームがあるとします。テキスト ボックスにタブで移動し、既に何かが含まれている場合、そのボックス内のすべてのテキストを選択して、入力するとそのテキストが消去されるようにします。ボックスをマウスでクリックすると、おそらくどこかの文字を変更したいことを意味するので、この場合はすべてを強調表示しないでください。十分に簡単に思えますが、これまでのところ良い解決策は私にはわかりませんでした。これは私がこれまでに持っていたもので、動作に非常に近いですが、完全ではありません。

<Style x:Key="TextBoxStyle" TargetType="TextBox">
    <EventSetter Event="GotKeyboardFocus" Handler="EventSetter_OnHandler" />
</Style>

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    TextBox txt = sender as TextBox;
    if (txt != null) txt.SelectAll();
}

そのため、ボックスがキーボード フォーカスを取得すると、すべてが選択されるため、テキスト ボックスにタブで移動すると、すべてのテキストが完全に選択されます。ただし、マウスをクリックすると、このメソッドも呼び出され、テキストも強調表示されますが、クリックすると、マウスがクリックされた場所にカーソルが置かれます。機能的には完璧ですが、マウスをクリックしたときにすべてを選択するとちらつくのが気になります。これを行うためのより良い方法、またはイベントに何らかのチェックを入れて、タブではなくマウスクリックからキーボードフォーカスを取得したことを確認しますか?

4

5 に答える 5

0

添付の動作パターンを使用できます

public class Behaviors
{
    public static readonly DependencyProperty SelectTextOnFocusProperty = DependencyProperty
        .RegisterAttached("SelectTextOnFocus", typeof(bool), typeof(Behaviors), new FrameworkPropertyMetadata(false, GotFocus));

    public static void SetSelectTextOnFocus(DependencyObject obj, bool value)
    {
        obj.SetValue(SelectTextOnFocusProperty, value);
    }

    private static void GotFocus(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var textbox = d as TextBox;

        if (null == textbox) return;

        textbox.GotKeyboardFocus += SelectTextOnFocus;
        textbox.GotMouseCapture += SelectTextOnFocus;
    }

    private static void SelectTextOnFocus(object sender, RoutedEventArgs e)
    {
        if (!(sender is TextBox)) return;
        ((TextBox)sender).SelectAll();
    }
}

あなたのxamlで必要なのは

xmlns:my="clr-namespace:Namespace;assembly=Rkmax"

次のようなTextBoxで使用できます

<TextBox my:Behaviors.SelectTextOnFocus="True" />

これはすべて、マウスとキーボードのイベントで機能します

于 2012-08-03T00:33:13.860 に答える
0

最後に押されたキーをキャプチャして、イベントで比較できます

private Key lastKey;
protected override void OnKeyDown(KeyEventArgs e)
{
     lastKey = e.Key;
     base.OnKeyDown(e);
}

そしてあなたのイベントで:

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    if(lastKey != Key.Tab)
        return;

    TextBox txt = sender as TextBox;
    if (txt != null) txt.SelectAll();
}

タブを押して(コントロールにタブで移動するのではなく)、コントロールをクリックする可能性があるため、完全ではありません。しかし、ほとんどの場合は機能します。

于 2012-08-02T23:22:48.353 に答える