如何 select 单击鼠标时文本框的所有文本? (TextBox.SelectAll() 不适用于 TextBox.Enter)

How to select all text of a TextBox on mouse click? (TextBox.SelectAll() not working on TextBox.Enter)

编辑:WPF 标签是个错误,这是 winforms。


我有一个 TextBox,我希望在用户单击它时突出显示其中的所有文本(以便他们可以轻松替换它)。我将以下事件处理程序链接到 TextBox:

private void TextBox_Enter(object sender, EventArgs e) {
    SelectAll();
}

但是当我点击 TextBox 时,文本只被选中了几分之一秒(有时速度太快我根本看不到)然后它又变回光标.有谁知道如何解决这个问题,或者是否有任何相对简单的解决方法?谢谢。

编辑: 我用 TextBox.MouseClick 事件尝试了同样的事情(它突出显示了文本)但是因为它是 MouseClick 事件文本每次我单击 TextBox 时都会突出显示(即使 TextBox 已经获得焦点)。

我也试过 SelectionStart = 0; SelectionLength = Text.Length 但同样的事情发生了。这让我相信这个问题与事件有关。

我也尝试了 TextBox.GotFocus 事件并遇到了完全相同的问题。

我正在 windows 表单应用程序中执行此操作。

谢天谢地,我找到了解决办法!事实证明 Click 事件在 Enter 事件之前执行,这让我可以设置一个 JustGotFocus 变量并执行以下操作:

private void myTextBox_Click(object sender, EventArgs e) {

    this.JustGotFocus = true;

    if (JustGotFocus) {
        myTextBox.SelectAll();
    }
}

private void myTextBox_Enter(object sender, EventArgs e) {
    JustGotFocus = false;
}

如果其他人遇到此问题,希望我的解决方案有用。

您没有看到文本得到 selected 的原因是 TextBox 在其中一个事件发生时正忙(例如,插入符号定位)。你实际上 select 文本,但是 TextBox 的内部事件处理程序执行并删除 selection 例如通过设置插入符位置。

您所要做的就是等待内部事件处理程序完成。
您可以使用 Dispatcher 来执行此操作。当您异步调用 Dispatcher 时,委托不会立即执行,而是在所有先前排队的操作(如内部事件处理程序)从调度程序队列中清除后排队并执行。

因此,在 WPF 中使用 TextBox.GotFocus 事件(或在 WinForms 中使用 TextBox.Enter)和异步 Dispatcher 将达到目的:

WPF

private async void SelectAll_OnTextBoxGotFocus(object sender, RoutedEventArgs e)
{
  await Application.Current.Dispatcher.InvokeAsync((sender as TextBox).SelectAll);
}

WinForms

private void SelectAll_OnTextBoxEnter(object sender, EventArgs e)
{
  var textBox = sender as TextBox;
  textBox.BeginInvoke(new Action(textBox.SelectAll));
}