From 1fa00c2634d9bfed7e5633e8586120042dda57ff Mon Sep 17 00:00:00 2001 From: JLdgu Date: Thu, 13 Aug 2026 14:12:08 +0100 Subject: [PATCH 1/5] Allow triple left click on a TextBox to select all text --- src/MainDemo.Wpf/Fields.xaml | 20 +++++----- .../TextFieldAssist.cs | 39 +++++++++++++++++++ .../WPF/TextBoxes/TextBoxTests.cs | 21 ++++++++++ 3 files changed, 70 insertions(+), 10 deletions(-) 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() { From fc516bcd8027a8ebdc6dcc28135feb872263caa3 Mon Sep 17 00:00:00 2001 From: JLdgu <114992499+JLdgu@users.noreply.github.com> Date: Mon, 17 Aug 2026 09:40:53 +0100 Subject: [PATCH 2/5] Update src/MaterialDesignThemes.Wpf/TextFieldAssist.cs Co-authored-by: Corvin <43533385+corvinsz@users.noreply.github.com> --- src/MaterialDesignThemes.Wpf/TextFieldAssist.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs index 42c0684b30..53eaf2c345 100644 --- a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs +++ b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs @@ -170,7 +170,7 @@ private static void OnSelectAllOnTripleClickChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is TextBox textBox) + if (d is TextBoxBase textBox) { if ((bool)e.NewValue) textBox.PreviewMouseLeftButtonDown += TextBox_PreviewMouseLeftButtonDown; From 3fb4d217adf638b8b1840b50bf7bf66b2c544fb7 Mon Sep 17 00:00:00 2001 From: JLdgu <114992499+JLdgu@users.noreply.github.com> Date: Mon, 17 Aug 2026 09:41:17 +0100 Subject: [PATCH 3/5] Update src/MaterialDesignThemes.Wpf/TextFieldAssist.cs Co-authored-by: Corvin <43533385+corvinsz@users.noreply.github.com> --- src/MaterialDesignThemes.Wpf/TextFieldAssist.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs index 53eaf2c345..70d518dbeb 100644 --- a/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs +++ b/src/MaterialDesignThemes.Wpf/TextFieldAssist.cs @@ -183,7 +183,7 @@ private static void TextBox_PreviewMouseLeftButtonDown( object sender, MouseButtonEventArgs e) { - if (e.ClickCount == 3 && sender is TextBox textBox) + if (e.ClickCount == 3 && sender is TextBoxBase textBox) { textBox.SelectAll(); e.Handled = true; From 9c96e67c3e0d3118c2e7999083560008fdae77f2 Mon Sep 17 00:00:00 2001 From: JLdgu Date: Mon, 17 Aug 2026 10:26:20 +0100 Subject: [PATCH 4/5] Add test to ensure that when triple click false not all text is selected Update Demos with dedicated samples --- src/MainDemo.Wpf/Fields.xaml | 8 ++++- src/MaterialDesign3.Demo.Wpf/Fields.xaml | 13 +++++++-- .../WPF/TextBoxes/TextBoxTests.cs | 29 +++++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/MainDemo.Wpf/Fields.xaml b/src/MainDemo.Wpf/Fields.xaml index 0209417bdd..58395ddefc 100644 --- a/src/MainDemo.Wpf/Fields.xaml +++ b/src/MainDemo.Wpf/Fields.xaml @@ -99,7 +99,6 @@ @@ -149,7 +148,14 @@ Style="{StaticResource MaterialDesignFloatingHintTextBox}" Text="Some Text" /> + + + + + diff --git a/src/MaterialDesign3.Demo.Wpf/Fields.xaml b/src/MaterialDesign3.Demo.Wpf/Fields.xaml index 6bcfd37bc6..79ac1c13c0 100644 --- a/src/MaterialDesign3.Demo.Wpf/Fields.xaml +++ b/src/MaterialDesign3.Demo.Wpf/Fields.xaml @@ -43,7 +43,7 @@ - + @@ -54,6 +54,7 @@ + + + + + - ($$""" + + """); + + await textBox.LeftClick(); + await textBox.LeftClick(); + await textBox.LeftClick(); + + await Wait.For(async () => + { + string? selectedText = await textBox.GetSelectedText(); + + await Assert.That(selectedText).IsEqualTo("select"); + }); + } + + [Test] + public async Task TextBox_WithSelectAllOnTripleClick_True_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(); @@ -518,7 +541,7 @@ await Wait.For(async () => }); } - [Test] + [Test] [Description("Issue 3176")] public async Task ValidationErrorTemplate_WithChangingErrors_UpdatesValidation() { From 70d4012760b559117aa0aa9f636af43e1add1aad Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Thu, 20 Aug 2026 21:42:44 -0700 Subject: [PATCH 5/5] Default TextFieldAssist.SelectAllOnTripleClick to true Makes triple-click-to-select-all the default behavior for TextBoxes using Material Design styles, aligning with common user expectations for text input fields. Refactors TextFieldAssist Get/Set methods to use TextBoxBase for improved type specificity and encapsulates the event handler. Updates demos and UI tests to reflect this new default and accurately demonstrate both enabled and disabled states. --- src/MainDemo.Wpf/Fields.xaml | 4 ++-- src/MaterialDesign3.Demo.Wpf/Fields.xaml | 4 ++-- .../TextFieldAssist.cs | 21 ++++++++++--------- .../Themes/MaterialDesignTheme.TextBox.xaml | 1 + .../WPF/TextBoxes/TextBoxTests.cs | 17 +++++++-------- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/MainDemo.Wpf/Fields.xaml b/src/MainDemo.Wpf/Fields.xaml index 58395ddefc..be5fe9088a 100644 --- a/src/MainDemo.Wpf/Fields.xaml +++ b/src/MainDemo.Wpf/Fields.xaml @@ -152,9 +152,9 @@ - + Text="Triple click does not select all text" /> diff --git a/src/MaterialDesign3.Demo.Wpf/Fields.xaml b/src/MaterialDesign3.Demo.Wpf/Fields.xaml index 79ac1c13c0..fdf7a2c3bd 100644 --- a/src/MaterialDesign3.Demo.Wpf/Fields.xaml +++ b/src/MaterialDesign3.Demo.Wpf/Fields.xaml @@ -167,9 +167,9 @@ - + Text="Triple click does not select all text" /> + public static bool GetSelectAllOnTripleClick(TextBoxBase obj) => (bool)obj.GetValue(SelectAllOnTripleClickProperty); - public static void SetSelectAllOnTripleClick(DependencyObject obj, bool value) => + public static void SetSelectAllOnTripleClick(TextBoxBase obj, bool value) => obj.SetValue(SelectAllOnTripleClickProperty, value); private static void OnSelectAllOnTripleClickChanged( @@ -177,18 +177,19 @@ private static void OnSelectAllOnTripleClickChanged( else textBox.PreviewMouseLeftButtonDown -= TextBox_PreviewMouseLeftButtonDown; } - } - private static void TextBox_PreviewMouseLeftButtonDown( - object sender, - MouseButtonEventArgs e) - { - if (e.ClickCount == 3 && sender is TextBoxBase textBox) + static void TextBox_PreviewMouseLeftButtonDown( + object sender, + MouseButtonEventArgs e) { - textBox.SelectAll(); - e.Handled = true; + if (e.ClickCount == 3 && sender is TextBoxBase textBox) + { + textBox.SelectAll(); + e.Handled = true; + } } } + /// /// SuffixText dependency property /// diff --git a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml index e80e3ef2e7..670cb90621 100644 --- a/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml +++ b/src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml @@ -629,6 +629,7 @@ + diff --git a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs index 2870c158fc..3c004f7759 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/TextBoxes/TextBoxTests.cs @@ -507,31 +507,30 @@ public async Task TextBox_WithSelectAllOnTripleClick_False_DoesNotSelectAllText( Width="200" VerticalAlignment="Center" HorizontalAlignment="Center" /> """); - await textBox.LeftClick(); - await textBox.LeftClick(); - await textBox.LeftClick(); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); await Wait.For(async () => { string? selectedText = await textBox.GetSelectedText(); - await Assert.That(selectedText).IsEqualTo("select"); + await Assert.That(selectedText).IsEqualTo("Some "); }); } [Test] - public async Task TextBox_WithSelectAllOnTripleClick_True_SelectsAllText() + public async Task TextBox_WithDefaultSelectAllOnTripleClick_SelectsAllText() { var textBox = await LoadXaml($$""" """); - await textBox.LeftClick(); - await textBox.LeftClick(); - await textBox.LeftClick(); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); + await textBox.LeftClick(Position.LeftCenter, xOffset: 30); await Wait.For(async () => {