PR

[C#][WPF]テキストボックスにフォーカスしたときに全選択する

VisualStudio C#

WPFに限らず、TextBoxにフォーカスが移動した際、既に入力されているテキストを全選択させて欲しいという要件は珍しくありません。

ですが、WPFのTextBoxにはフォーカス時に全選択する機能がありません。

というわけで、全選択させる方法を解説します。

GotFocusイベントでテキストを全選択する

this.GotFocus += (s, e) =>
{
    this.SelectAll();
};

TextBoxには、全ての内容を選択するメソッド(SelectAll)が存在するので、意図的に呼び出してあげれば良いです。

ただし、これだけだとマウスを使ってフォーカスした際に問題があります。
クリックした瞬間は全選択されますが、マウスのボタンを離した際にキャレットが移動して選択が解除されてしまいます。

マウスクリックでもテキストを全選択する

this.PreviewMouseLeftButtonDown += (s, e) =>
{
    e.Handled = true;
    this.Focus();
};

e.Handledでイベントをキャンセルして、改めてFocusメソッドでフォーカスを設定する。

「TextBoxにフォーカスしたときに全選択する」という目的はこれで達成できるはず。
ですが、これだとマウスをいくらクリックしてもテキストが全選択になってしまうので、「1文字修正したいのに~」というような場面では使いづらい。

TextBoxにフォーカスしたときに全選択するには

this.GotFocus += (s, e) =>
{
    this.SelectAll();
};
this.PreviewMouseLeftButtonDown += (s, e) =>
{
    if (IsFocused)
    {
        return;
    }
    e.Handled = true;
    this.Focus();
};

ポイントは、PreviewMouseLeftButtonDownに追加したIF文です。

フォーカスがすでにある状態のときには、イベントをキャンセルせずに標準の挙動となるようにしました。

ちょっとしたことですが、お客様の満足度には大きく影響する対応でした。

コメント

タイトルとURLをコピーしました