C# WinForms テキスト ボックスがフォーカスを受け取ったときに、ブラウザーのアドレス バーのように動作するようにしたいと思います。
何を意味しているかを確認するには、Web ブラウザのアドレス バーをクリックしてください。次のような動作が見られます。
- テキスト ボックスが以前にフォーカスされていなかった場合、テキスト ボックスをクリックするとすべてのテキストが選択されます。
- テキスト ボックス内でマウスを押したままドラッグすると、マウスで強調表示したテキストのみが選択されるはずです。
- テキストボックスにすでにフォーカスがある場合は、クリックしてもすべてのテキストは選択されません。
- プログラムまたはキーボードのタブを使用してテキスト ボックスにフォーカスすると、すべてのテキストが選択されます。
まさにこれを WinForms で実行したいのです。
最速の銃警報: 回答する前に以下をお読みください!みんなありがとう。 :-)
.Enter または .GotFocus イベント中に .SelectAll() を呼び出すと機能しません。ユーザーがテキスト ボックスをクリックすると、クリックした場所にキャレットが配置され、すべてのテキストの選択が解除されるためです。
.Click イベント中に .SelectAll() を呼び出すと機能しませんユーザーはマウスでテキストを選択できなくなるため、.SelectAll() 呼び出しによってユーザーのテキスト選択が上書きされ続けます。
focus/enter イベントの enter で BeginInvoke((Action)textbox.SelectAll) を呼び出しても機能しません上記のルール 2 に違反しているため、フォーカス時にユーザーの選択が上書きされ続けます。
ベストアンサー1
まず、回答ありがとうございます。合計 9 件の回答です。ありがとうございます。
残念なお知らせです。すべての回答に、おかしな点があったり、まったく機能しなかったりしました (またはまったく機能しませんでした)。投稿ごとにコメントを追加しました。
良いニュースです。これを機能させる方法を見つけました。この解決策は非常に簡単で、すべてのシナリオ (マウスダウン、テキストの選択、タブフォーカスなど) で機能するようです。
bool alreadyFocused;
...
textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;
...
void textBox1_Leave(object sender, EventArgs e)
{
alreadyFocused = false;
}
void textBox1_GotFocus(object sender, EventArgs e)
{
// Select all text only if the mouse isn't down.
// This makes tabbing to the textbox give focus.
if (MouseButtons == MouseButtons.None)
{
this.textBox1.SelectAll();
alreadyFocused = true;
}
}
void textBox1_MouseUp(object sender, MouseEventArgs e)
{
// Web browsers like Google Chrome select the text on mouse up.
// They only do it if the textbox isn't already focused,
// and if the user hasn't selected all text.
if (!alreadyFocused && this.textBox1.SelectionLength == 0)
{
alreadyFocused = true;
this.textBox1.SelectAll();
}
}
私の知る限り、これによりテキスト ボックスは Web ブラウザーのアドレス バーとまったく同じように動作します。
この一見単純な問題を解決しようとする次の人にとって、これが役に立つことを願っています。
皆さん、私を正しい道へと導いてくれたすべての回答に改めて感謝します。