在XAML中,是否有一种方法可以在双击文本框时选择所有文本?

6
有没有一种纯粹通过XAML来突出显示文本框中所有文本的方法,或者必须在Xaml.cs中完成?谢谢!

6
您不能仅使用XAML完成这项任务,但您无需专门在代码后台中进行操作。您可以编写一个行为来完成它。然后,您只需使用XAML应用该行为即可。以下是一个示例,应该可以帮助您入门:http://blogs.msdn.com/b/dgartner/archive/2009/11/11/wpf-attached-behavior-example-watermark-text.aspx - Henrik Söderlund
1
我可以给你展示一个确切的例子,以解释 Henrik 建议的问题行为。你要求在文本框上双击时突出显示所有文本,但实际上在 WPF 中默认就是这样的行为。 - Farhad Jabiyev
谢谢回复,我正在查看Henrik发布的示例。 - KeyboardFriendly
1
Farhad:当我双击文本时,它只会突出显示一个单词,我以为默认情况下应该突出显示所有单词。再次感谢。 - KeyboardFriendly
1
这听起来像是预期的行为,我认为3次点击会调用SelectAll()函数。 - Chris W.
2个回答

13

这是你需要做的:

首先,将DoubleClickBehavior.cs类添加到您的项目中。

class DoubleClickBehavior : Behavior<TextBox>
    {
        protected override void OnAttached()
        {
            AssociatedObject.MouseDoubleClick += AssociatedObjectMouseDoubleClick;
            base.OnAttached();
        }

        protected override void OnDetaching()
        {
            AssociatedObject.MouseDoubleClick -= AssociatedObjectMouseDoubleClick;
            base.OnDetaching();
        }

        private void AssociatedObjectMouseDoubleClick(object sender, RoutedEventArgs routedEventArgs)
        {
            AssociatedObject.SelectAll();
        }
    }

然后在 .xaml 中,将这个行为添加到你的 TextBox 中:

<TextBox>
        <i:Interaction.Behaviors>
            <local:DoubleClickBehavior/>
        </i:Interaction.Behaviors>
</TextBox>
你需要在你的.xaml中添加两个命名空间来使用你的行为。(我的项目名称是WpfApplication1,所以你可能需要更改它):
 xmlns:local ="clr-namespace:WpfApplication1" 
 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

就这样。您还需要System.Windows.Interactivity.dll才能使用Behavior类。

您可以从Nuget Package 管理器下载它。


7
使用文本框,您可以添加PreviewMouseDoubleClick事件。
<TextBox DockPanel.Dock="Top" Name="MyTextBox" AcceptsReturn="True" PreviewMouseDoubleClick="TextBoxSelectAll"/>

然后,您将TextBoxTextBox.SelectedText 属性 设置为TextBox中的文本。
private void TextBoxSelectAll(object sender, MouseButtonEventArgs e) {
    // Set the event as handled
    e.Handled = true;
    // Select the Text
    (sender as TextBox).SelectAll();
}

@FarhadJabiyev 你的 Behaviour 做了同样的事情,在我的 XAML 中,选择文本直接与双击动作相关联。在你的 XAML 中,你添加了 Behaviour 来附加事件。同样的事情,我的方法似乎更简单。 - Bob.
@FarhadJabiyev 怎么了?选择文本不是视图(GUI)的一部分,而不是“模型”或“视图模型”的一部分吗? - Bob.
我错了吗?在MVVM方面,我有点新手。如果我错了,请纠正我。 - Farhad Jabiyev
@FarhadJabiyev 我不相信有任何MVVM,文本框的操作是UI的一部分,而不是数据的操作,因为没有数据的变化,这与我们操作数据(即将TextBox.Text更改为其他内容)不同。 - Bob.
@Ryan 感谢你的建议。我同意你的观点,不过个人认为向 WPF 新手展示简单的解决方案,然后逐步使用“行为”更好。 :) - Bob.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接