如何 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));
}
编辑: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));
}