From 1fa00c2634d9bfed7e5633e8586120042dda57ff Mon Sep 17 00:00:00 2001 From: JLdgu Date: Thu, 13 Aug 2026 14:12:08 +0100 Subject: [PATCH 1/4] 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/4] 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/4] 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/4] 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() {