为什么WPF文本框不支持三击以选择所有文本

时间:2017-02-17 11:41:18

标签: c# wpf textbox

有没有理由说WPF文本框现在不像大多数现代用户界面那样支持三击行为?

通过"三击",我的意思是:双击文本框中的一行文字选择一个单词,而三击则选择整行。

是否有可以应用于文本框或其他解决方法的属性?微软是否有可能将其作为WPF文本框的默认行为实现?

3 个答案:

答案 0 :(得分:10)

如前所述,您可以手动实现。但是,您不希望为应用程序中的每个文本框执行此操作。因此,您可以实现附加属性并将其设置为样式,如下所示:

public static class TextBoxBehavior {
    public static readonly DependencyProperty TripleClickSelectAllProperty = DependencyProperty.RegisterAttached(
        "TripleClickSelectAll", typeof(bool), typeof(TextBoxBehavior), new PropertyMetadata(false, OnPropertyChanged));

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        var tb = d as TextBox;
        if (tb != null) {
            var enable = (bool)e.NewValue;
            if (enable) {
                tb.PreviewMouseLeftButtonDown += OnTextBoxMouseDown;
            }
            else {
                tb.PreviewMouseLeftButtonDown -= OnTextBoxMouseDown;
            }
        }
    }

    private static void OnTextBoxMouseDown(object sender, MouseButtonEventArgs e) {
        if (e.ClickCount == 3)
        {
            ((TextBox)sender).SelectAll();
        }
    }

    public static void SetTripleClickSelectAll(DependencyObject element, bool value)
    {
        element.SetValue(TripleClickSelectAllProperty, value);
    }

    public static bool GetTripleClickSelectAll(DependencyObject element) {
        return (bool) element.GetValue(TripleClickSelectAllProperty);
    }
}

然后在某处创建样式(例如在App.xaml中的应用程序资源中):

<Application.Resources>
    <Style TargetType="TextBox">
        <Setter Property="local:TextBoxBehavior.TripleClickSelectAll"
                Value="True" />
    </Style>
</Application.Resources>

现在,您的所有文本框都会自动具有此三次单击行为。

答案 1 :(得分:2)

您可以使用PreviewMouseDown-Event

进行尝试
private void MyTextBoxPreviewMouseDown(object sender, MouseButtonEventArgs e){

  if (e.ClickCount == 3) {
    MyTexBox.SelectAll();
  }
}

答案 2 :(得分:0)

因此,如果由于某种原因,您和我一样感到困惑,因为三次点击已经被烘焙,而您实际上正在寻找一种方法来删除它,我使用了Jehof's answer,如下所示工作正常:

private void MyTextBoxPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 3) 
    {
        e.Handled = true;
        return;
    }
}