如果我从 GotFocus
事件处理程序调用 SelectAll
,它对鼠标不起作用 - 一旦释放鼠标,选择就会消失 .
编辑:人们都喜欢Donnelle的回答,我会试着解释为什么我不喜欢它和接受的答案一样多 .
-
它更复杂,而接受的答案以更简单的方式做同样的事情 .
-
接受答案的可用性更好 . 当您单击文本中间时,释放鼠标时文本将被取消选中,允许您立即开始编辑,如果您仍想选择全部,只需再次按下按钮,这次它将不会在发布时取消选择 . 按照Donelle的配方,如果我在文本中间单击,我必须单击第二次才能编辑 . 如果我单击文本中的某个位置而不是文本外部,这很可能意味着我想开始编辑而不是覆盖所有内容 .
28 回答
尝试将它放在构造函数中,无论控制文本框是什么:
这是迄今为止最简单的解决方案 .
将全局处理程序添加到应用程序(App.xaml.cs)并完成 . 您只需要几行代码 .
因此,使用EventManager类为类型(TextBox)注册全局事件处理程序 . 实际的处理程序很简单:
点击这里:WPF TextBox SelectAll on Focus
希望能帮助到你 .
不知道为什么它在GotFocus事件中失去了选择 .
但一种解决方案是在GotKeyboardFocus和GotMouseCapture事件上进行选择 . 这样它总能奏效 .
我们有它所以第一次点击选择全部,另一次点击进入光标(我们的应用程序设计用于带有笔的平板电脑) .
你可能会发现它很有用 .
Donnelle的答案效果最好,但是必须派出一个新课程才能使用它是一种痛苦 .
而不是这样做我在App.xaml.cs中为处理程序中的处理程序注册了应用程序中的所有TextBox . 这允许我使用标准TextBox控件的Donnelle答案 .
将以下方法添加到App.xaml.cs:
这是相当古老的,但无论如何我都会展示我的答案 .
我选择了部分Donnelle 's answer (skipped the double-click) for I think this creates the least astonishment in the users. However, like gcores I dislike the need to create a derived class. But I also don' t像gcores "on Startup..."方法 . 而且我需要这个_b20710_basis .
我已将此实现为附加依赖项属性,因此我可以在xaml中设置
SelectTextOnFocus.Active=True
. 我发现这种方式最令人愉悦 .对于我的“一般但不总是”特征,我在(全局)TextBox-Style中将此属性设置为True . 这种方式“选择文本”总是“打开”,但我可以在每个文本框的基础上禁用它 .
以下是实现答案解决方案的Blend行为,以方便您:
一个用于附加到单个TextBox:
一个用于附加到包含多个TextBox'es的容器的根目录:
这是MSDN上一个非常好的非常简单的解决方案:
这是背后的代码:
虽然这是一个老问题,但我刚刚遇到了这个问题但是使用附加行为解决了它,而不是表达行为,因为谢尔盖's answer. This means I don't需要依赖于混合SDK中的
System.Windows.Interactivity
:然后,您可以在XAML中使用它,如下所示:
我在博客上写了这篇文章here .
这似乎对我有用 . 这基本上是对一些早期帖子的回顾 . 我只是将它放入构造函数中的MainWindow.xaml.cs文件中 . 我创建了两个处理程序,一个用于键盘,一个用于鼠标,并将两个事件汇集到同一个函数
HandleGotFocusEvent
中,该函数在同一文件中的构造函数之后定义 .我认为这很有效:
如果您想将其实现为扩展方法:
在你的GotFocus活动中:
我发现了上面的解决方案,因为几个月前我一直在寻找一种方法来将焦点设置为给定的UIElement . 我在某处发现了下面的代码(特此授予)并且效果很好 . 我发布它即使它与OP的问题没有直接关系,因为它演示了使用Dispatcher处理UIElement的相同模式 .
我发现这里提到的答案都没有模仿标准的Windows文本框 . 例如,尝试单击文本框的最后一个字符和文本框右侧之间的空白区域 . 这里的大多数解决方案将始终选择整个内容,这使得将文本附加到文本框非常困难 .
我在这里提出的答案在这方面表现得更好 . 这是一种行为(因此需要来自Blend SDK的System.Windows.Interactivity程序集) . 它也可以使用附加属性重写 .
这是基于我发现here的代码 .
在App.xaml文件中
在App.xaml.cs文件中
使用此代码,您可以访问应用程序中的所有TextBox .
这个简单的实现非常适合我:
要将其应用于所有
TextBox
,请在InitializeComponent();
之后输入以下代码摘自here:
在App.xaml.cs文件中注册全局事件处理程序:
然后处理程序就像这样简单:
我有一个稍微简化的答案(仅使用PreviewMouseLeftButtonDown事件),它似乎模仿了浏览器的常用功能:
在xaml中你有一个文本框说:
在codebehind中:
我有同样的问题 . 在VB.Net中,它的工作方式很简单:
VB XAML:
Codehind:
C# (感谢ViRuSTriNiTy)
我意识到这是非常古老的,但这是我的解决方案,它基于表达式/微软交互性和交互名称空间 .
首先,我按照指令at this link将交互触发器放入样式中 .
然后归结为此
还有这个
就我而言,我有一个用户控件,其中文本框有代码隐藏 . 代码隐藏具有处理函数 . 我在xaml中给了我的用户控件一个名字,我正在使用该名称作为元素 . 这对我来说非常合适 . 只需将样式应用于您希望在文本框中单击时选择所有文本的任何文本框 .
当文本框上的GotKeyboardFocus事件触发时,第一个CallMethodAction调用文本框的SelectAll函数 .
我希望这有帮助 .
对于那些对Donnelle / Groky的方法感兴趣的人,但想要点击最后一个字符的右边(但仍然在TextBox中)将插入符号放在输入文本的末尾,我想出了这个解决方案:
GetRoundedCharacterIndexFromPoint方法取自this post .
尝试使用此扩展方法将所需行为添加到任何TextBox控件 . 我还没有广泛测试它,但似乎满足了我的需求 .
我搜索了很多解决方案,我找到了几个解决方案来选择但是,问题是当我们右键单击并在从文本框中选择部分文本后进行剪切/复制时,它会选择所有甚至我选择的部分文本 . 解决这个问题是解决方案 . 只需在键盘选择事件中添加以下代码即可 . 这对我有用 .
我使用了Nils的答案,但转换为更灵活 .
在XAML中,您可以使用以下其中一种:
在doubleclick之后覆盖mouseDown并选择all的简单方法是:
谢尔盖 .
在谷歌搜索和测试后,我找到了一个适合我的简单解决方案 .
您需要将事件处理程序添加到容器窗口的“已加载”事件:
接下来,您必须在以前的代码中为引用的RoutedEventHandler创建处理程序:
现在,您可以将GotFocus事件处理程序上的SelectAll()命令分别添加到任何TextBox控件:
现在您的文字在焦点上被选中!
改编自Dr. WPF solution, MSDN Forums
这是@Nasenbaer发布的answer的C#版本
而
MyTextBox_GotFocus
是分配给MyTextBox
的GotFocus
事件的事件处理程序 .我测试了所有这些,但只有以下结果:
哇!阅读完上述所有内容后,我发现自己不堪重负 . 我接受了我在这篇文章中学到的东西并尝试了一些完全不同的东西 . 要在文本框中获得焦点时选择文本我使用:
将文本框的GotFocus属性设置为此方法 .
运行应用程序并在文本框中单击一次会突出显示文本框中的所有内容 .
如果确实如此,目标是在用户点击文本框时选择文本,这看起来很简单并且涉及的代码少得多 . 只是说......