c# - 如何在鼠标单击时选择 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 窗体应用程序中执行此操作。
解决方案
您没有看到文本被选中的原因TextBox
是当其中一个事件发生(例如,插入符号定位)时它很忙。您实际上选择了文本,然后执行的内部事件处理程序TextBox
并删除了选择,例如通过设置插入符号位置。
您所要做的就是等到内部事件处理程序完成。
您可以使用Dispatcher
. 当您Dispatcher
异步调用时,委托不会立即执行,而是会在所有先前排队的操作(如内部事件处理程序)从调度程序队列中清除后排队并执行。
因此,使用TextBox.GotFocus
WPF(或TextBox.Enter
WinForms)中的事件和异步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));
}
推荐阅读
- assembly - 为什么这种使用 BIOS 磁盘服务读取扇区不起作用?
- reactjs - 为什么我在我的 cordova 应用程序中收到此错误:“Firebase:错误(auth/redirect-cancelled-by-user)”
- python - python加密和解密
- python - 在 python 和 mysql 中出现异常错误
- javascript - 如何在 AJAX 响应中将数据插入 IndexedDB?
- openlayers - OpenLayers 6 GeoTiff 样式表达式 - 为什么波段值在 0 和 1 之间?
- app-inventor - 如何使用 MIT APP Inventor II 将图像上传到 Google Drive
- azure-service-fabric - 如何确定运行 Service Fabric 集群的操作系统类型
- ada - 如何访问具有该过程作为访问参数的过程/函数的 Pre/Post 合同中的过程参数?
- python - 如何在teamcity中分离构建步骤的输出日志