From 95d19726ebf2ade775bea16dcf2f284a1ce96284 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 27 Dec 2018 00:01:03 +0800 Subject: [PATCH] add Rate --- HandyControl/Controls/Input/NumericUpDown.cs | 15 +- HandyControl/Controls/Rate/Rate.cs | 225 ++++++++++++++++++ HandyControl/Controls/Rate/RateItem.cs | 201 ++++++++++++++++ HandyControl/Controls/Window/BlurWindow.cs | 9 +- HandyControl/Data/ResourceToken.cs | 2 + HandyControl/Data/ResourceToken.tt | 3 +- HandyControl/Data/ValueBoxes.cs | 4 + HandyControl/HandyControl.csproj | 13 +- HandyControl/Themes/Basic/Geometries.xaml | 1 + .../Themes/Styles/Base/RateBaseStyle.xaml | 90 +++++++ HandyControl/Themes/Styles/Rate.xaml | 10 + HandyControl/Themes/Styles/Style.xaml | 1 + HandyControl/Tools/Helper/ArithmeticHelper.cs | 8 + HandyControlDemo/App.xaml.cs | 4 + HandyControlDemo/Data/MessageToken.cs | 2 + HandyControlDemo/Data/MessageToken.tt | 3 +- HandyControlDemo/HandyControlDemo.csproj | 10 + .../Properties/Langs/Lang.Designer.cs | 9 + .../Properties/Langs/Lang.en.resx | 3 + HandyControlDemo/Properties/Langs/Lang.resx | 3 + .../Resources/Img/LeftMainContent/Star.png | Bin 0 -> 1904 bytes .../Resources/Themes/Basic/Geometries.xaml | 1 + .../Tools}/CommonHelper.cs | 2 +- .../UserControl/Controls/RateDemoCtl.xaml | 14 ++ .../UserControl/Controls/RateDemoCtl.xaml.cs | 10 + .../UserControl/Main/LeftMainContent.xaml | 9 +- README.md | 4 + Resources/Rate.png | Bin 0 -> 3435 bytes 28 files changed, 634 insertions(+), 22 deletions(-) create mode 100644 HandyControl/Controls/Rate/Rate.cs create mode 100644 HandyControl/Controls/Rate/RateItem.cs create mode 100644 HandyControl/Themes/Styles/Base/RateBaseStyle.xaml create mode 100644 HandyControl/Themes/Styles/Rate.xaml create mode 100644 HandyControlDemo/Resources/Img/LeftMainContent/Star.png rename {HandyControl/Tools/Helper => HandyControlDemo/Tools}/CommonHelper.cs (95%) create mode 100644 HandyControlDemo/UserControl/Controls/RateDemoCtl.xaml create mode 100644 HandyControlDemo/UserControl/Controls/RateDemoCtl.xaml.cs create mode 100644 Resources/Rate.png diff --git a/HandyControl/Controls/Input/NumericUpDown.cs b/HandyControl/Controls/Input/NumericUpDown.cs index 8c539a2d..a22eab01 100644 --- a/HandyControl/Controls/Input/NumericUpDown.cs +++ b/HandyControl/Controls/Input/NumericUpDown.cs @@ -4,6 +4,7 @@ using System.Windows.Controls; using System.Windows.Input; using HandyControl.Data; using HandyControl.Interactivity; +using HandyControl.Tools; namespace HandyControl.Controls { @@ -152,7 +153,7 @@ namespace HandyControl.Controls public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( "Value", typeof(double), typeof(NumericUpDown), new FrameworkPropertyMetadata(default(double), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, - OnValueChanged, CoerceValue), IsValidDoubleValue); + OnValueChanged, CoerceValue), ArithmeticHelper.IsValidDoubleValue); private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -203,7 +204,7 @@ namespace HandyControl.Controls /// 最大值 /// public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register( - "Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(100.0, OnMaximumChanged, CoerceMaximum), IsValidDoubleValue); + "Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(100.0, OnMaximumChanged, CoerceMaximum), ArithmeticHelper.IsValidDoubleValue); private static void OnMaximumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -231,7 +232,7 @@ namespace HandyControl.Controls /// 最小值 /// public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register( - "Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(default(double), OnMinimumChanged, CoerceMinimum), IsValidDoubleValue); + "Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(default(double), OnMinimumChanged, CoerceMinimum), ArithmeticHelper.IsValidDoubleValue); private static void OnMinimumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -255,14 +256,6 @@ namespace HandyControl.Controls set => SetValue(MinimumProperty, value); } - private static bool IsValidDoubleValue(object value) - { - var d = (double)value; - if (!double.IsNaN(d)) - return !double.IsInfinity(d); - return false; - } - /// /// 指示每单击一下按钮时增加或减少的数量 /// diff --git a/HandyControl/Controls/Rate/Rate.cs b/HandyControl/Controls/Rate/Rate.cs new file mode 100644 index 00000000..e2595971 --- /dev/null +++ b/HandyControl/Controls/Rate/Rate.cs @@ -0,0 +1,225 @@ +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using HandyControl.Data; + +namespace HandyControl.Controls +{ + public class Rate : ItemsControl + { + private bool _isLoaded; + + public Rate() + { + AddHandler(RateItem.SelectedChangedEvent, new RoutedEventHandler(RateItemSelectedChanged)); + AddHandler(RateItem.ValueChangedEvent, new RoutedEventHandler(RateItemValueChanged)); + + Loaded += (s, e) => + { + if (_isLoaded) return; + _isLoaded = true; + if (Value <= 0) + { + if (DefaultValue > 0) + { + Value = DefaultValue; + UpdateItems(); + } + } + else + { + UpdateItems(); + } + }; + } + + private void RateItemValueChanged(object sender, RoutedEventArgs e) => Value = + (from RateItem item in Items where item.IsSelected select item.IsHalf ? 0.5 : 1).Sum(); + + private void RateItemSelectedChanged(object sender, RoutedEventArgs e) + { + if (e.OriginalSource is RateItem rateItem) + { + var index = rateItem.Index; + for (int i = 0; i < index; i++) + { + if (Items[i] is RateItem item) + { + item.IsSelected = true; + item.IsHalf = false; + } + } + for (int i = index; i < Count; i++) + { + if (Items[i] is RateItem item) + { + item.IsSelected = false; + item.IsHalf = false; + } + } + } + } + + public static readonly DependencyProperty ItemMarginProperty = DependencyProperty.Register( + "ItemMargin", typeof(Thickness), typeof(Rate), new PropertyMetadata(default(Thickness))); + + public Thickness ItemMargin + { + get => (Thickness)GetValue(ItemMarginProperty); + set => SetValue(ItemMarginProperty, value); + } + + public static readonly DependencyProperty ItemWidthProperty = DependencyProperty.Register( + "ItemWidth", typeof(double), typeof(Rate), new PropertyMetadata(ValueBoxes.Double20Box)); + + public double ItemWidth + { + get => (double)GetValue(ItemWidthProperty); + set => SetValue(ItemWidthProperty, value); + } + + public static readonly DependencyProperty ItemHeightProperty = DependencyProperty.Register( + "ItemHeight", typeof(double), typeof(Rate), new PropertyMetadata(ValueBoxes.Double20Box)); + + public double ItemHeight + { + get => (double)GetValue(ItemHeightProperty); + set => SetValue(ItemHeightProperty, value); + } + + public static readonly DependencyProperty AllowHalfProperty = DependencyProperty.Register( + "AllowHalf", typeof(bool), typeof(Rate), new PropertyMetadata(ValueBoxes.FalseBox)); + + public bool AllowHalf + { + get => (bool)GetValue(AllowHalfProperty); + set => SetValue(AllowHalfProperty, value); + } + + public static readonly DependencyProperty AllowClearProperty = DependencyProperty.Register( + "AllowClear", typeof(bool), typeof(Rate), new PropertyMetadata(ValueBoxes.TrueBox)); + + public bool AllowClear + { + get => (bool)GetValue(AllowClearProperty); + set => SetValue(AllowClearProperty, value); + } + + public static readonly DependencyProperty IconProperty = DependencyProperty.Register( + "Icon", typeof(Geometry), typeof(Rate), new PropertyMetadata(default(Geometry))); + + public Geometry Icon + { + get => (Geometry)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + public static readonly DependencyProperty CountProperty = DependencyProperty.Register( + "Count", typeof(int), typeof(Rate), new PropertyMetadata(ValueBoxes.Int5Box)); + + public int Count + { + get => (int)GetValue(CountProperty); + set => SetValue(CountProperty, value); + } + + public static readonly DependencyProperty DefaultValueProperty = DependencyProperty.Register( + "DefaultValue", typeof(double), typeof(Rate), new PropertyMetadata(ValueBoxes.Double0Box)); + + public double DefaultValue + { + get => (double)GetValue(DefaultValueProperty); + set => SetValue(DefaultValueProperty, value); + } + + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( + "Value", typeof(double), typeof(Rate), new PropertyMetadata(ValueBoxes.Double0Box)); + + public double Value + { + get => (double)GetValue(ValueProperty); + set => SetValue(ValueProperty, value); + } + + public static readonly DependencyProperty TextProperty = DependencyProperty.Register( + "Text", typeof(string), typeof(Rate), new PropertyMetadata(default(string))); + + public string Text + { + get => (string)GetValue(TextProperty); + set => SetValue(TextProperty, value); + } + + public static readonly DependencyProperty ShowTextProperty = DependencyProperty.Register( + "ShowText", typeof(bool), typeof(Rate), new PropertyMetadata(ValueBoxes.FalseBox)); + + public bool ShowText + { + get => (bool)GetValue(ShowTextProperty); + set => SetValue(ShowTextProperty, value); + } + + protected override bool IsItemItsOwnContainerOverride(object item) => item is RateItem; + + protected override DependencyObject GetContainerForItemOverride() => new RateItem(); + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + if (!_isLoaded) + { + Items.Clear(); + + for (int i = 1; i <= Count; i++) + { + Items.Add(new RateItem + { + Index = i + }); + } + } + } + + protected override void OnMouseLeave(MouseEventArgs e) + { + base.OnMouseLeave(e); + + UpdateItems(); + } + + private void UpdateItems() + { + var count = (int)Value; + for (int i = 0; i < count; i++) + { + if (Items[i] is RateItem rateItem) + { + rateItem.IsSelected = true; + rateItem.IsHalf = false; + } + } + if (Value > count) + { + if (Items[count] is RateItem rateItem) + { + rateItem.IsSelected = true; + rateItem.IsHalf = true; + } + count += 1; + } + for (int i = count; i < Count; i++) + { + if (Items[i] is RateItem rateItem) + { + rateItem.IsSelected = false; + rateItem.IsHalf = false; + } + } + } + + public void Reset() => Value = DefaultValue; + } +} diff --git a/HandyControl/Controls/Rate/RateItem.cs b/HandyControl/Controls/Rate/RateItem.cs new file mode 100644 index 00000000..383a61ea --- /dev/null +++ b/HandyControl/Controls/Rate/RateItem.cs @@ -0,0 +1,201 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using HandyControl.Data; +using HandyControl.Tools.Extension; + +namespace HandyControl.Controls +{ + [TemplatePart(Name = ElementIcon, Type = typeof(FrameworkElement))] + public class RateItem : Control + { + private const string ElementIcon = "PART_Icon"; + + private FrameworkElement _icon; + + private bool _isLoaded; + + private bool _isSentValue; + + private bool _isMouseLeftButtonDown; + + public RateItem() => Loaded += (s, e) => _isLoaded = true; + + public static readonly DependencyProperty AllowClearProperty = DependencyProperty.Register( + "AllowClear", typeof(bool), typeof(RateItem), new PropertyMetadata(ValueBoxes.TrueBox)); + + public bool AllowClear + { + get => (bool)GetValue(AllowClearProperty); + set => SetValue(AllowClearProperty, value); + } + + public static readonly DependencyProperty AllowHalfProperty = DependencyProperty.Register( + "AllowHalf", typeof(bool), typeof(RateItem), new PropertyMetadata(ValueBoxes.FalseBox, OnAllowHalfChanged)); + + private static void OnAllowHalfChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var ctl = (RateItem)d; + ctl.HandleMouseMoveEvent((bool)e.NewValue); + } + + public bool AllowHalf + { + get => (bool)GetValue(AllowHalfProperty); + set => SetValue(AllowHalfProperty, value); + } + + public static readonly DependencyProperty IconProperty = DependencyProperty.Register( + "Icon", typeof(Geometry), typeof(RateItem), new PropertyMetadata(default(Geometry))); + + public Geometry Icon + { + get => (Geometry)GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + internal static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register( + "IsSelected", typeof(bool), typeof(RateItem), new PropertyMetadata(ValueBoxes.FalseBox, OnIsSelectedChanged)); + + private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var ctl = (RateItem)d; + ctl._icon.Show((bool)e.NewValue); + } + + internal bool IsSelected + { + get => (bool)GetValue(IsSelectedProperty); + set => SetValue(IsSelectedProperty, value); + } + + public static readonly RoutedEvent SelectedChangedEvent = + EventManager.RegisterRoutedEvent("SelectedChanged", RoutingStrategy.Bubble, + typeof(RoutedEventHandler), typeof(RateItem)); + + public event RoutedEventHandler SelectedChanged + { + add => AddHandler(SelectedChangedEvent, value); + remove => RemoveHandler(SelectedChangedEvent, value); + } + + public static readonly RoutedEvent ValueChangedEvent = + EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, + typeof(RoutedEventHandler), typeof(RateItem)); + + public event RoutedEventHandler ValueChanged + { + add => AddHandler(ValueChangedEvent, value); + remove => RemoveHandler(ValueChangedEvent, value); + } + + private bool _isHalf; + + internal bool IsHalf + { + get => _isHalf; + set + { + if (_isHalf == value) return; + _isHalf = value; + _icon.Width = value ? ActualWidth / 2 : ActualWidth; + } + } + + internal int Index { get; set; } + + private void HandleMouseMoveEvent(bool handle) + { + if (handle) + { + MouseMove += RateItem_MouseMove; + } + else + { + MouseMove -= RateItem_MouseMove; + } + } + + private void RateItem_MouseMove(object sender, MouseEventArgs e) + { + if (!AllowHalf) return; + var p = e.GetPosition(this); + IsHalf = p.X < ActualWidth / 2; + } + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _icon = GetTemplateChild(ElementIcon) as FrameworkElement; + + if (_isLoaded) + { + if (_icon == null) return; + _icon.Show(IsSelected); + _icon.Width = IsHalf ? ActualWidth / 2 : ActualWidth; + } + } + + protected override void OnMouseEnter(MouseEventArgs e) + { + base.OnMouseEnter(e); + + _isSentValue = false; + IsSelected = true; + RaiseEvent(new RoutedEventArgs(SelectedChangedEvent) { Source = this }); + } + + protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonDown(e); + + _isMouseLeftButtonDown = true; + } + + protected override void OnMouseLeave(MouseEventArgs e) + { + base.OnMouseLeave(e); + + _isMouseLeftButtonDown = false; + } + + protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonUp(e); + + if (_isMouseLeftButtonDown) + { + if (Index == 1 && AllowClear) + { + if (IsSelected) + { + if (!_isSentValue) + { + RaiseEvent(new RoutedEventArgs(ValueChangedEvent) {Source = this}); + _isMouseLeftButtonDown = false; + _isSentValue = true; + return; + } + _isSentValue = false; + IsSelected = false; + IsHalf = false; + } + else + { + IsSelected = true; + if (AllowHalf) + { + var p = e.GetPosition(this); + IsHalf = p.X < ActualWidth / 2; + } + } + } + + RaiseEvent(new RoutedEventArgs(ValueChangedEvent) {Source = this}); + _isMouseLeftButtonDown = false; + } + } + } +} \ No newline at end of file diff --git a/HandyControl/Controls/Window/BlurWindow.cs b/HandyControl/Controls/Window/BlurWindow.cs index 44ec09d5..e9ccb82c 100644 --- a/HandyControl/Controls/Window/BlurWindow.cs +++ b/HandyControl/Controls/Window/BlurWindow.cs @@ -13,17 +13,18 @@ namespace HandyControl.Controls EnableBlur(this); } + public static SystemVersionInfo SystemVersionInfo { get; set; } + internal static void EnableBlur(Window window) { var accentPolicy = new ExternDllHelper.ACCENTPOLICY(); var accentPolicySize = Marshal.SizeOf(accentPolicy); - var versionInfo = CommonHelper.GetSystemVersionInfo(); - if (versionInfo >= SystemVersionInfo.Windows10_1809) + if (SystemVersionInfo >= SystemVersionInfo.Windows10_1809) { accentPolicy.AccentState = ExternDllHelper.ACCENTSTATE.ACCENT_ENABLE_ACRYLICBLURBEHIND; } - else if (versionInfo >= SystemVersionInfo.Windows10) + else if (SystemVersionInfo >= SystemVersionInfo.Windows10) { accentPolicy.AccentState = ExternDllHelper.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND; } @@ -33,7 +34,7 @@ namespace HandyControl.Controls } accentPolicy.AccentFlags = 2; - accentPolicy.GradientColor = ResourceHelper.GetResource("BlurGradientValue"); + accentPolicy.GradientColor = ResourceHelper.GetResource(ResourceToken.BlurGradientValue); var accentPtr = Marshal.AllocHGlobal(accentPolicySize); Marshal.StructureToPtr(accentPolicy, accentPtr, false); diff --git a/HandyControl/Data/ResourceToken.cs b/HandyControl/Data/ResourceToken.cs index 7107e421..e3c9c236 100644 --- a/HandyControl/Data/ResourceToken.cs +++ b/HandyControl/Data/ResourceToken.cs @@ -30,6 +30,8 @@ public static readonly string ThirdlyTextBrush = nameof(ThirdlyTextBrush); + public static readonly string BlurGradientValue = nameof(BlurGradientValue); + public static readonly string ButtonCustom = nameof(ButtonCustom); public static readonly string PaginationButtonStyle = nameof(PaginationButtonStyle); diff --git a/HandyControl/Data/ResourceToken.tt b/HandyControl/Data/ResourceToken.tt index e4a77c12..ad53ea13 100644 --- a/HandyControl/Data/ResourceToken.tt +++ b/HandyControl/Data/ResourceToken.tt @@ -20,7 +20,8 @@ var brushList = new List "WarningBrush", "AccentBrush", "PrimaryTextBrush", - "ThirdlyTextBrush" + "ThirdlyTextBrush", + "BlurGradientValue" }; var styleList = new List { diff --git a/HandyControl/Data/ValueBoxes.cs b/HandyControl/Data/ValueBoxes.cs index ece11652..63599e41 100644 --- a/HandyControl/Data/ValueBoxes.cs +++ b/HandyControl/Data/ValueBoxes.cs @@ -13,6 +13,8 @@ internal static object Double1Box = 1.0; + internal static object Double20Box = 20.0; + internal static object Double100Box = 100.0; internal static object DoubleNeg1Box = -1.0; @@ -21,6 +23,8 @@ internal static object Int1Box = 1; + internal static object Int5Box = 5; + internal static object BooleanBox(bool value) => value ? TrueBox : FalseBox; } } \ No newline at end of file diff --git a/HandyControl/HandyControl.csproj b/HandyControl/HandyControl.csproj index bd2d4e25..d28b79d8 100644 --- a/HandyControl/HandyControl.csproj +++ b/HandyControl/HandyControl.csproj @@ -110,6 +110,8 @@ + + @@ -200,7 +202,6 @@ - @@ -575,6 +576,14 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -667,7 +676,6 @@ - @@ -701,6 +709,7 @@ + diff --git a/HandyControl/Themes/Basic/Geometries.xaml b/HandyControl/Themes/Basic/Geometries.xaml index 09aa01b0..9fb0882e 100644 --- a/HandyControl/Themes/Basic/Geometries.xaml +++ b/HandyControl/Themes/Basic/Geometries.xaml @@ -23,6 +23,7 @@ M0,4 L10,4 L10,5 L0,5 z M1,3 L1,9 L7,9 L7,3 z M3,1 L3,2 L8,2 L8,7 L9,7 L9,1 z M2,0 L10,0 L10,8 L8,8 L8,10 L0,10 L0,2 L2,2 z M1,1 L1,9 L9,9 L9,1 z M0,0 L10,0 L10,10 L0,10 z + M535.9 165.2l96.5 195.4c3.9 7.9 11.4 13.3 20.1 14.6l215.7 31.3c21.9 3.2 30.6 30 14.8 45.5L726.8 604.1c-6.3 6.1-9.1 14.9-7.7 23.6L756 842.5c3.7 21.8-19.1 38.4-38.7 28.1L524.4 769.2c-7.8-4.1-17-4.1-24.8 0L306.7 870.6c-19.6 10.3-42.4-6.3-38.7-28.1l36.8-214.8c1.5-8.6-1.4-17.5-7.7-23.6L141.1 452c-15.8-15.4-7.1-42.3 14.8-45.5l215.7-31.3c8.7-1.3 16.2-6.7 20.1-14.6l96.5-195.4c9.7-19.9 37.9-19.9 47.7 0z M938.666667 426.666667h-341.333334V85.333333c0-46.933333-38.4-85.333333-85.333333-85.333333s-85.333333 38.4-85.333333 85.333333v341.333334H85.333333c-46.933333 0-85.333333 38.4-85.333333 85.333333s38.4 85.333333 85.333333 85.333333h341.333334v341.333334c0 46.933333 38.4 85.333333 85.333333 85.333333s85.333333-38.4 85.333333-85.333333v-341.333334h341.333334c46.933333 0 85.333333-38.4 85.333333-85.333333s-38.4-85.333333-85.333333-85.333333z M62.5797 488.9508c0.2632 42.5185 34.985 77.2116 77.5035 77.5035l743.0216-0.6728c42.5185 0.3215 76.7437-33.9333 76.4518-76.4805l0 0c-0.2918-42.5175-34.985-77.2106-77.5045-77.5035l-743.0216-0.087C96.513 411.4473 62.2879 446.4323 62.5797 488.9508L62.5797 488.9508z M943.644188 827.215696l-351.176649-608.204749c-42.945473-74.36249-113.147387-74.36249-156.092861 0l-351.176649 608.204749c-42.946498 74.431167-7.811716 135.14955 78.012605 135.14955l702.420949 0C951.455904 962.36422 986.555836 901.645838 943.644188 827.215696zM466.187532 391.579035c12.621133-13.644108 28.66175-20.466675 48.233578-20.466675 19.580028 0 35.612444 6.75389 48.241778 20.194018 12.544256 13.473954 18.820484 30.325365 18.820484 50.587035 0 17.430551-26.19759 145.621205-34.929778 238.882082l-63.105666 0c-7.666162-93.259852-36.090106-221.450507-36.090106-238.882082C447.358847 421.938226 453.643275 405.155491 466.187532 391.579035zM561.76804 835.026386c-13.268949 12.928641-29.062535 19.375023-47.345906 19.375023-18.275171 0-34.076957-6.447407-47.346931-19.375023-13.235123-12.89379-19.818859-28.517221-19.818859-46.869269 0-18.249546 6.583736-34.043131 19.818859-47.278254 13.268949-13.235123 29.07176-19.852685 47.346931-19.852685 18.283371 0 34.076957 6.617562 47.345906 19.852685 13.235123 13.235123 19.827059 29.028709 19.827059 47.278254C581.595099 806.51019 575.003163 822.132597 561.76804 835.026386z diff --git a/HandyControl/Themes/Styles/Base/RateBaseStyle.xaml b/HandyControl/Themes/Styles/Base/RateBaseStyle.xaml new file mode 100644 index 00000000..9d29a661 --- /dev/null +++ b/HandyControl/Themes/Styles/Base/RateBaseStyle.xaml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/Rate.xaml b/HandyControl/Themes/Styles/Rate.xaml new file mode 100644 index 00000000..e738b8c6 --- /dev/null +++ b/HandyControl/Themes/Styles/Rate.xaml @@ -0,0 +1,10 @@ + + + + + + +