2017-02-17 30 views
5

是否有一個原因,爲什麼WPF文本框不支持像現代UI最近那樣的三擊行爲?爲什麼WPF文本框不支持三擊選擇所有文本

通過「三擊」,我的意思是:雙擊文本在文本行選擇一個單詞,而三擊選擇整行。

是否有可應用於文本框或其他解決辦法的屬性?微軟是否有機會將其作爲WPF文本框的默認行爲來實現?

回答

8

前面已經回答了,你可以手動實現一個嘗試。但是您不希望爲應用程序中的每個文本框執行此操作。所以,你可以實現附加屬性,並設置它的風格,就像這樣:

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> 

現在所有的文本框會自動有這種三擊行爲。

2

您可以通過使用PreviewMouseDown-事件

private void MyTextBoxPreviewMouseDown(object sender, MouseButtonEventArgs e){ 

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