From bd2c15ae25e808b5f33b4fbe07aa66b050852199 Mon Sep 17 00:00:00 2001 From: punker76 Date: Thu, 18 Jun 2020 00:24:20 +0200 Subject: [PATCH] (GH-3839) Move AutomationProperties bindings to the new HamburgerMenuListBox --- .../HamburgerMenuCreatorsUpdate.xaml | 2 +- .../HamburgerMenu/HamburgerMenuListBox.cs | 142 ++++++++++++++++++ .../MenuItems/IHamburgerMenuItem.cs | 10 ++ .../HamburgerMenuItemAccessibleConverter.cs | 10 +- .../Themes/HamburgerMenuTemplate.xaml | 40 ----- 5 files changed, 158 insertions(+), 46 deletions(-) diff --git a/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/HamburgerMenuCreatorsUpdate.xaml b/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/HamburgerMenuCreatorsUpdate.xaml index 2f6164b9fb..a978d04fde 100644 --- a/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/HamburgerMenuCreatorsUpdate.xaml +++ b/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/HamburgerMenuCreatorsUpdate.xaml @@ -162,7 +162,7 @@ - + diff --git a/src/MahApps.Metro/Controls/HamburgerMenu/HamburgerMenuListBox.cs b/src/MahApps.Metro/Controls/HamburgerMenu/HamburgerMenuListBox.cs index 932158cf60..3eb5cc58fb 100644 --- a/src/MahApps.Metro/Controls/HamburgerMenu/HamburgerMenuListBox.cs +++ b/src/MahApps.Metro/Controls/HamburgerMenu/HamburgerMenuListBox.cs @@ -1,12 +1,15 @@ using System.Windows; +using System.Windows.Automation; using System.Windows.Controls; using System.Windows.Data; +using MahApps.Metro.Converters; namespace MahApps.Metro.Controls { public class HamburgerMenuListBox : ListBox { private readonly BooleanToVisibilityConverter booleanToVisibilityConverter = new BooleanToVisibilityConverter(); + private readonly HamburgerMenuItemAccessibleConverter hamburgerMenuItemAccessibleConverter = new HamburgerMenuItemAccessibleConverter(); static HamburgerMenuListBox() { @@ -40,6 +43,142 @@ protected override void PrepareContainerForItemOverride(DependencyObject element Path = new PropertyPath(nameof(IHamburgerMenuItem.IsEnabled)), FallbackValue = true }); + + if (item is DependencyObject) + { + var helpTextPropertyMultiBinding = new MultiBinding + { + Converter = this.hamburgerMenuItemAccessibleConverter, + Bindings = + { + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(nameof(IHamburgerMenuItem.ToolTip)), + Mode = BindingMode.OneWay, + FallbackValue = null + }, + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(AutomationProperties.HelpTextProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + } + } + }; + listBoxItem.SetBinding(AutomationProperties.HelpTextProperty, helpTextPropertyMultiBinding); + + listBoxItem.SetBinding(AutomationProperties.LabeledByProperty, + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(AutomationProperties.LabeledByProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + + var namePropertyMultiBinding = new MultiBinding + { + Converter = this.hamburgerMenuItemAccessibleConverter, + Bindings = + { + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(nameof(IHamburgerMenuItem.Label)), + Mode = BindingMode.OneWay, + FallbackValue = null + }, + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(AutomationProperties.NameProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + } + } + }; + listBoxItem.SetBinding(AutomationProperties.NameProperty, namePropertyMultiBinding); + } + else + { + listBoxItem.SetBinding(AutomationProperties.HelpTextProperty, + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(nameof(IHamburgerMenuItem.ToolTip)), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + + listBoxItem.SetBinding(AutomationProperties.NameProperty, + new Binding + { + Source = hamburgerMenuItem, + Path = new PropertyPath(nameof(IHamburgerMenuItem.Label)), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + } + } + + if (item is IHamburgerMenuHeaderItem hamburgerMenuHeaderItem) + { + if (item is DependencyObject) + { + listBoxItem.SetBinding(AutomationProperties.HelpTextProperty, + new Binding + { + Source = hamburgerMenuHeaderItem, + Path = new PropertyPath(AutomationProperties.HelpTextProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + + listBoxItem.SetBinding(AutomationProperties.LabeledByProperty, + new Binding + { + Source = hamburgerMenuHeaderItem, + Path = new PropertyPath(AutomationProperties.LabeledByProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + + var namePropertyMultiBinding = new MultiBinding + { + Converter = this.hamburgerMenuItemAccessibleConverter, + Bindings = + { + new Binding + { + Source = hamburgerMenuHeaderItem, + Path = new PropertyPath(nameof(IHamburgerMenuHeaderItem.Label)), + Mode = BindingMode.OneWay, + FallbackValue = null + }, + new Binding + { + Source = hamburgerMenuHeaderItem, + Path = new PropertyPath(AutomationProperties.NameProperty), + Mode = BindingMode.OneWay, + FallbackValue = null + } + } + }; + listBoxItem.SetBinding(AutomationProperties.NameProperty, namePropertyMultiBinding); + } + else + { + listBoxItem.SetBinding(AutomationProperties.NameProperty, + new Binding + { + Source = hamburgerMenuHeaderItem, + Path = new PropertyPath(nameof(IHamburgerMenuHeaderItem.Label)), + Mode = BindingMode.OneWay, + FallbackValue = null + }); + } } } } @@ -52,6 +191,9 @@ protected override void ClearContainerForItemOverride(DependencyObject element, { BindingOperations.ClearBinding(listBoxItem, VisibilityProperty); BindingOperations.ClearBinding(listBoxItem, IsEnabledProperty); + BindingOperations.ClearBinding(listBoxItem, AutomationProperties.HelpTextProperty); + BindingOperations.ClearBinding(listBoxItem, AutomationProperties.LabeledByProperty); + BindingOperations.ClearBinding(listBoxItem, AutomationProperties.NameProperty); } } } diff --git a/src/MahApps.Metro/Controls/HamburgerMenu/MenuItems/IHamburgerMenuItem.cs b/src/MahApps.Metro/Controls/HamburgerMenu/MenuItems/IHamburgerMenuItem.cs index 69ae640707..7e27deb089 100644 --- a/src/MahApps.Metro/Controls/HamburgerMenu/MenuItems/IHamburgerMenuItem.cs +++ b/src/MahApps.Metro/Controls/HamburgerMenu/MenuItems/IHamburgerMenuItem.cs @@ -2,6 +2,16 @@ { public interface IHamburgerMenuItem { + /// + /// Gets or sets a value that specifies label to display. + /// + string Label { get; set; } + + /// + /// Gets or sets a value that specifies ToolTip to display. + /// + object ToolTip { get; set; } + /// /// Gets or sets a value indicating whether this item is enabled in the user interface (UI). /// diff --git a/src/MahApps.Metro/Converters/HamburgerMenuItemAccessibleConverter.cs b/src/MahApps.Metro/Converters/HamburgerMenuItemAccessibleConverter.cs index 314d017a05..baecc2e4f9 100644 --- a/src/MahApps.Metro/Converters/HamburgerMenuItemAccessibleConverter.cs +++ b/src/MahApps.Metro/Converters/HamburgerMenuItemAccessibleConverter.cs @@ -8,9 +8,9 @@ namespace MahApps.Metro.Converters { [ValueConversion(typeof(object), typeof(object))] [MarkupExtensionReturnType(typeof(HamburgerMenuItemAccessibleConverter))] - public class HamburgerMenuItemAccessibleConverter : MarkupMultiConverter + public class HamburgerMenuItemAccessibleConverter : IValueConverter, IMultiValueConverter { - public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is null) { @@ -20,12 +20,12 @@ public override object Convert(object value, Type targetType, object parameter, return value; } - public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return Binding.DoNothing; } - public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values is null) { @@ -41,7 +41,7 @@ public override object Convert(object[] values, Type targetType, object paramete return this.Convert(values.ElementAtOrDefault(0), targetType, parameter, culture); } - public override object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { return targetTypes.Select(t => Binding.DoNothing).ToArray(); } diff --git a/src/MahApps.Metro/Themes/HamburgerMenuTemplate.xaml b/src/MahApps.Metro/Themes/HamburgerMenuTemplate.xaml index 818749dc1b..a699e5bea8 100644 --- a/src/MahApps.Metro/Themes/HamburgerMenuTemplate.xaml +++ b/src/MahApps.Metro/Themes/HamburgerMenuTemplate.xaml @@ -1,7 +1,6 @@  - - - - - - - - - - - - - - - - - @@ -325,20 +299,6 @@