WinForms TextBox をブラウザのアドレスバーのように動作させる 質問する

WinForms TextBox をブラウザのアドレスバーのように動作させる 質問する

C# WinForms テキスト ボックスがフォーカスを受け取ったときに、ブラウザーのアドレス バーのように動作するようにしたいと思います。

何を意味しているかを確認するには、Web ブラウザのアドレス バーをクリックしてください。次のような動作が見られます。

  1. テキスト ボックスが以前にフォーカスされていなかった場合、テキスト ボックスをクリックするとすべてのテキストが選択されます。
  2. テキスト ボックス内でマウスを押したままドラッグすると、マウスで強調表示したテキストのみが選択されるはずです。
  3. テキストボックスにすでにフォーカスがある場合は、クリックしてもすべてのテキストは選択されません。
  4. プログラムまたはキーボードのタブを使用してテキスト ボックスにフォーカスすると、すべてのテキストが選択されます。

まさにこれを 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 ブラウザーのアドレス バーとまったく同じように動作します。

この一見単純な問題を解決しようとする次の人にとって、これが役に立つことを願っています。

皆さん、私を正しい道へと導いてくれたすべての回答に改めて感謝します。

おすすめ記事