diff --git a/src/MainDemo.Wpf/Fields.xaml b/src/MainDemo.Wpf/Fields.xaml index 68481e35ea..0209417bdd 100644 --- a/src/MainDemo.Wpf/Fields.xaml +++ b/src/MainDemo.Wpf/Fields.xaml @@ -99,6 +99,7 @@ @@ -182,18 +183,18 @@ - + + VerticalScrollBarVisibility="Auto" /> @@ -690,12 +691,11 @@ - + + materialDesign:HintAssist.HintPaddingBrush="Chocolate" + Style="{StaticResource MaterialDesignOutlinedTextBox}" /> @@ -704,7 +704,7 @@ - + - + @@ -774,7 +774,7 @@ - + diff --git a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs index aac1a63024..42c0684b30 100644 --- a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs +++ b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs @@ -150,6 +150,45 @@ public static class TextFieldAssist public static bool GetIncludeSpellingSuggestions(TextBoxBase element) => (bool)element.GetValue(IncludeSpellingSuggestionsProperty); + /// + /// Allow triple click to select all text in a TextBox. + /// + public static readonly DependencyProperty SelectAllOnTripleClickProperty = + DependencyProperty.RegisterAttached( + "SelectAllOnTripleClick", + typeof(bool), + typeof(TextFieldAssist), + new PropertyMetadata(false, OnSelectAllOnTripleClickChanged)); + + public static bool GetSelectAllOnTripleClick(DependencyObject obj) => + (bool)obj.GetValue(SelectAllOnTripleClickProperty); + + public static void SetSelectAllOnTripleClick(DependencyObject obj, bool value) => + obj.SetValue(SelectAllOnTripleClickProperty, value); + + private static void OnSelectAllOnTripleClickChanged( + DependencyObject d, + DependencyPropertyChangedEventArgs e) + { + if (d is TextBox textBox) + { + if ((bool)e.NewValue) + textBox.PreviewMouseLeftButtonDown += TextBox_PreviewMouseLeftButtonDown; + else + textBox.PreviewMouseLeftButtonDown -= TextBox_PreviewMouseLeftButtonDown; + } + } + + private static void TextBox_PreviewMouseLeftButtonDown( + object sender, + MouseButtonEventArgs e) + { + if (e.ClickCount == 3 && sender is TextBox textBox) + { + textBox.SelectAll(); + e.Handled = true; + } + } /// /// SuffixText dependency property /// diff --git a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs index 7a248ca4ef..c8dbb4ed9c 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs @@ -498,6 +498,27 @@ public async Task TextBox_MultiLineAndFixedHeight_RespectsVerticalContentAlignme } [Test] + public async Task TextBox_WithSelectAllOnTripleClick_SelectsAllText() + { + var textBox = await LoadXaml($$""" + + """); + await textBox.LeftClick(); + await textBox.LeftClick(); + await textBox.LeftClick(); + //await Task.Delay(1000); + await Wait.For(async () => + { + string? selectedText = await textBox.GetSelectedText(); + + await Assert.That(selectedText).IsEqualTo("Some text to select"); + }); + } + + [Test] [Description("Issue 3176")] public async Task ValidationErrorTemplate_WithChangingErrors_UpdatesValidation() {