1. ホーム
  2. .net

[解決済み】WPFテキストボックスのフォーカス時にすべてのテキストを自動的に選択する方法は?

2022-04-01 02:44:40

質問

を呼び出すと SelectAll から GotFocus イベントハンドラでは、マウスでは動作しません。マウスを離すとすぐに選択範囲が消えてしまいます。

EDIT: 人々はDonnelleの答えを気に入っているようですが、私はなぜそれが受け入れられた答えほど好きではなかったのかを説明しようと思います。

  • 同じことをよりシンプルな方法で行っているのに対して、より複雑である。
  • 使い勝手は合格の方が良い。テキストの真ん中をクリックすると、マウスを離したときにテキストが非選択になり、瞬時に編集を開始することができます。ドネルのレシピでは、テキストの真ん中をクリックすると、2回目のクリックで編集が可能になります。テキスト内のどこかをクリックした場合とテキストの外側をクリックした場合、これはおそらく、すべてを上書きするのではなく、編集を開始したいことを意味します。

解決方法は?

において、なぜ選択範囲が失われるのか分かりません。 GotFocus イベントが発生します。

しかし、1つの解決策は、選択処理を GotKeyboardFocusGotMouseCapture イベントを使用します。そうすれば、常に動作するようになります。

-- 編集 --

ここに例を追加して、言及された欠点を回避する方法を人々に示す。

private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    // Fixes issue when clicking cut/copy/paste in context menu
    if (textBox.SelectionLength == 0) 
        textBox.SelectAll();
}

private void TextBox_LostMouseCapture(object sender, MouseEventArgs e)
{
    // If user highlights some text, don't override it
    if (textBox.SelectionLength == 0) 
        textBox.SelectAll();

    // further clicks will not select all
    textBox.LostMouseCapture -= TextBox_LostMouseCapture; 
}

private void TextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    // once we've left the TextBox, return the select all behavior
    textBox.LostMouseCapture += TextBox_LostMouseCapture;
}