From 16f4cd5575b28a084ae90305738342084a6e879d Mon Sep 17 00:00:00 2001 From: timunie <47110241+timunie@users.noreply.github.com> Date: Mon, 17 Jun 2019 13:47:08 +0200 Subject: [PATCH] (GH-3136) Introduce new Windows 10 CheckBox Style Introduced a new CheckBox Style that switches the colors for a better visibility, especially with a dark theme --- .../ExampleViews/ButtonsExample.xaml | 3 +- .../Controls/Helper/CheckBoxHelper.cs | 126 +++++++++++++++++- .../Converters/DoubleToGridLengthConverter.cs | 24 ++++ .../Styles/Controls.CheckBox.xaml | 69 ++++++++-- 4 files changed, 208 insertions(+), 14 deletions(-) create mode 100644 src/MahApps.Metro/Converters/DoubleToGridLengthConverter.cs diff --git a/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/ButtonsExample.xaml b/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/ButtonsExample.xaml index 738c9deae0..6e6ef952a8 100644 --- a/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/ButtonsExample.xaml +++ b/src/MahApps.Metro.Samples/MahApps.Metro.Demo/ExampleViews/ButtonsExample.xaml @@ -272,7 +272,8 @@ + IsThreeState="True" + Style="{StaticResource MahApps.Metro.Styles.CheckBox.Win10}"/> diff --git a/src/MahApps.Metro/Controls/Helper/CheckBoxHelper.cs b/src/MahApps.Metro/Controls/Helper/CheckBoxHelper.cs index 5b15bf76e6..575392c746 100644 --- a/src/MahApps.Metro/Controls/Helper/CheckBoxHelper.cs +++ b/src/MahApps.Metro/Controls/Helper/CheckBoxHelper.cs @@ -15,11 +15,21 @@ public static class CheckBoxHelper public static readonly DependencyProperty CheckBoxSizeProperty = DependencyProperty.RegisterAttached("CheckBoxSize", typeof(double), typeof(CheckBoxHelper), new FrameworkPropertyMetadata(18.0)); + /// + /// Gets the size of the CheckBox itself. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static double GetCheckBoxSize(DependencyObject obj) { return (double)obj.GetValue(CheckBoxSizeProperty); } + /// + /// Sets the size of the CheckBox itself. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetCheckBoxSize(DependencyObject obj, double value) { obj.SetValue(CheckBoxSizeProperty, value); @@ -34,46 +44,82 @@ public static void SetCheckBoxSize(DependencyObject obj, double value) public static readonly DependencyProperty CheckedBorderBrushProperty = DependencyProperty.RegisterAttached("CheckedBorderBrush", typeof(Brush), typeof(CheckBoxHelper), new FrameworkPropertyMetadata()); + /// + /// Gets the the Glyph for IsChecked = true. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static object GetCheckedGlyph(DependencyObject obj) { return (object)obj.GetValue(CheckedGlyphProperty); } + /// + /// Sets the the Glyph for IsChecked = true. + /// [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetCheckedGlyph(DependencyObject obj, object value) { obj.SetValue(CheckedGlyphProperty, value); } + /// + /// Gets the the Background for IsChecked = true. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetCheckedBackgroundBrush(DependencyObject obj) { return (Brush)obj.GetValue(CheckedBackgroundBrushProperty); } + /// + /// Sets the the Background for IsChecked = true. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetCheckedBackgroundBrush(DependencyObject obj, Brush value) { obj.SetValue(CheckedBackgroundBrushProperty, value); } - + /// + /// Gets the the GlyphTemplate for IsChecked = true. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static DataTemplate GetCheckedGlyphTemplate(DependencyObject obj) { return (DataTemplate)obj.GetValue(CheckedGlyphTemplateProperty); } + /// + /// Sets the the GlyphTemplate for IsChecked = true. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetCheckedGlyphTemplate(DependencyObject obj, DataTemplate value) { obj.SetValue(CheckedGlyphTemplateProperty, value); } + /// + /// Gets the the BorderBrush for IsChecked = true. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetCheckedBorderBrush(DependencyObject obj) { return (Brush)obj.GetValue(CheckedBorderBrushProperty); } + /// + /// Sets the the BorderBrush for IsChecked = true. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetCheckedBorderBrush(DependencyObject obj, Brush value) { obj.SetValue(CheckedBorderBrushProperty, value); @@ -90,46 +136,82 @@ public static void SetCheckedBorderBrush(DependencyObject obj, Brush value) public static readonly DependencyProperty UnCheckedBorderBrushProperty = DependencyProperty.RegisterAttached("UnCheckedBorderBrush", typeof(Brush), typeof(CheckBoxHelper), new FrameworkPropertyMetadata()); + /// + /// Gets the the Glyph for IsChecked = false. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static object GetUnCheckedGlyph(DependencyObject obj) { return (object)obj.GetValue(UnCheckedGlyphProperty); } + /// + /// Sets the the Glyph for IsChecked = false. + /// [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetUnCheckedGlyph(DependencyObject obj, object value) { obj.SetValue(UnCheckedGlyphProperty, value); } + /// + /// Gets the the BackgroundBrush for IsChecked = false. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetUnCheckedBackgroundBrush(DependencyObject obj) { return (Brush)obj.GetValue(UnCheckedBackgroundBrushProperty); } + /// + /// Sets the the BackgroundBrush for IsChecked = false. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetUnCheckedBackgroundBrush(DependencyObject obj, Brush value) { obj.SetValue(UnCheckedBackgroundBrushProperty, value); } - + /// + /// Gets the the GlyphTemplate for IsChecked = false. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static DataTemplate GetUnCheckedGlyphTemplate(DependencyObject obj) { return (DataTemplate)obj.GetValue(UnCheckedGlyphTemplateProperty); } + /// + /// Sets the the GlyphTemplate for IsChecked = false. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetUnCheckedGlyphTemplate(DependencyObject obj, DataTemplate value) { obj.SetValue(UnCheckedGlyphTemplateProperty, value); } + /// + /// Gets the the BorderBrush for IsChecked = false. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetUnCheckedBorderBrush(DependencyObject obj) { return (Brush)obj.GetValue(UnCheckedBorderBrushProperty); } + /// + /// Sets the the BorderBrush for IsChecked = false. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetUnCheckedBorderBrush(DependencyObject obj, Brush value) { obj.SetValue(UnCheckedBorderBrushProperty, value); @@ -146,46 +228,82 @@ public static void SetUnCheckedBorderBrush(DependencyObject obj, Brush value) public static readonly DependencyProperty IntermediateBorderBrushProperty = DependencyProperty.RegisterAttached("IntermediateBorderBrush", typeof(Brush), typeof(CheckBoxHelper), new FrameworkPropertyMetadata()); + /// + /// Gets the the Glyph for IsChecked = null. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static object GetIntermediateGlyph(DependencyObject obj) { return (object)obj.GetValue(IntermediateGlyphProperty); } + /// + /// Sets the the Glyph for IsChecked = null. + /// [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetIntermediateGlyph(DependencyObject obj, object value) { obj.SetValue(IntermediateGlyphProperty, value); } + /// + /// Gets the the BackgroundBrush for IsChecked = null. + /// + [Category(AppName.MahApps)] [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetIntermediateBackgroundBrush(DependencyObject obj) { return (Brush)obj.GetValue(IntermediateBackgroundBrushProperty); } + /// + /// Sets the the BackgroundBrush for IsChecked = null. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetIntermediateBackgroundBrush(DependencyObject obj, Brush value) { obj.SetValue(IntermediateBackgroundBrushProperty, value); } - + /// + /// Gets the the GlyphTemplate for IsChecked = null. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static DataTemplate GetIntermediateGlyphTemplate(DependencyObject obj) { return (DataTemplate)obj.GetValue(IntermediateGlyphTemplateProperty); } + /// + /// Sets the the GlyphTemplate for IsChecked = null. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetIntermediateGlyphTemplate(DependencyObject obj, DataTemplate value) { obj.SetValue(IntermediateGlyphTemplateProperty, value); } + /// + /// Gets the the BorderBrush for IsChecked = null. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static Brush GetIntermediateBorderBrush(DependencyObject obj) { return (Brush)obj.GetValue(IntermediateBorderBrushProperty); } + /// + /// Sets the the BorderBrush for IsChecked = null. + /// + [Category(AppName.MahApps)] + [AttachedPropertyBrowsableForType(typeof(CheckBox))] public static void SetIntermediateBorderBrush(DependencyObject obj, Brush value) { obj.SetValue(IntermediateBorderBrushProperty, value); @@ -193,7 +311,5 @@ public static void SetIntermediateBorderBrush(DependencyObject obj, Brush value) #endregion - - } } diff --git a/src/MahApps.Metro/Converters/DoubleToGridLengthConverter.cs b/src/MahApps.Metro/Converters/DoubleToGridLengthConverter.cs new file mode 100644 index 0000000000..d6a91452b1 --- /dev/null +++ b/src/MahApps.Metro/Converters/DoubleToGridLengthConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; + +namespace MahApps.Metro.Converters +{ + public class DoubleToGridLengthConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return new GridLength((double)value, GridUnitType.Pixel); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/MahApps.Metro/Styles/Controls.CheckBox.xaml b/src/MahApps.Metro/Styles/Controls.CheckBox.xaml index 8865c7c073..fb04376ed5 100644 --- a/src/MahApps.Metro/Styles/Controls.CheckBox.xaml +++ b/src/MahApps.Metro/Styles/Controls.CheckBox.xaml @@ -1,7 +1,10 @@  + xmlns:Controls="clr-namespace:MahApps.Metro.Controls" + xmlns:Converter="clr-namespace:MahApps.Metro.Converters"> + + +