首页 > 解决方案 > 如何在鼠标单击时选择 TextBox 的所有文本?(TextBox.SelectAll() 不适用于 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 窗体应用程序中执行此操作。

标签: c#winformstextboxcontrols

解决方案


您没有看到文本被选中的原因TextBox是当其中一个事件发生(例如,插入符号定位)时它很忙。您实际上选择了文本,然后执行的内部事件处理程序TextBox并删除了选择,例如通过设置插入符号位置。

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

因此,使用TextBox.GotFocusWPF(或TextBox.EnterWinForms)中的事件和异步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));
}

推荐阅读