From 7a6f293011f6b5a4d026c266c4bab8ea631c5fb5 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Tue, 25 Dec 2018 18:24:01 +0800 Subject: [PATCH 001/141] add BlurWindow --- HandyControl/Controls/Attach/IconElement.cs | 4 +- .../Controls/Attach/IconSwitchElement.cs | 15 +--- HandyControl/Controls/Other/ColorPicker.cs | 2 +- HandyControl/Controls/Window/BlurWindow.cs | 53 ++++++++++++ HandyControl/Controls/Window/ImageBrowser.cs | 2 +- HandyControl/Controls/Window/PopupWindow.cs | 6 +- .../Window/{WindowBorderless.cs => Window.cs} | 45 +++++------ HandyControl/Data/ResourceToken.cs | 2 +- HandyControl/Data/ResourceToken.tt | 2 +- HandyControl/Data/SystemVersionInfo.cs | 76 ++++++++++++++++++ HandyControl/HandyControl.csproj | 9 ++- HandyControl/Themes/Basic/Colors/Colors.xaml | 4 +- .../Themes/Basic/Colors/ColorsDark.xaml | 4 +- .../Themes/Basic/Colors/ColorsViolet.xaml | 4 +- HandyControl/Themes/Basic/Geometries.xaml | 8 +- .../Themes/Styles/Base/ButtonBaseStyle.xaml | 2 +- .../Styles/Base/ProgressBarBaseStyle.xaml | 2 +- .../Styles/Base/TabControlBaseStyle.xaml | 3 +- .../Styles/Base/ToggleButtonBaseStyle.xaml | 4 +- HandyControl/Themes/Styles/Button.xaml | 2 +- HandyControl/Themes/Styles/TabControl.xaml | 5 +- HandyControl/Themes/Styles/ToggleButton.xaml | 2 +- HandyControl/Themes/Styles/Window-net40.tt | 20 +++-- HandyControl/Themes/Styles/Window-netgt40.tt | 20 +++-- HandyControl/Themes/Styles/Window.xaml | 20 +++-- HandyControl/Tools/Helper/CommonHelper.cs | 25 ++++++ HandyControl/Tools/Helper/ExternDllHelper.cs | 37 +++++++++ HandyControl/Tools/Helper/ResourceHelper.cs | 10 ++- HandyControlDemo/App.xaml.cs | 1 + HandyControlDemo/Data/MessageToken.cs | 2 + HandyControlDemo/Data/MessageToken.tt | 3 +- HandyControlDemo/HandyControlDemo.csproj | 7 ++ HandyControlDemo/MainWindow.xaml | 10 +-- .../Properties/Langs/Lang.Designer.cs | 11 ++- .../Properties/Langs/Lang.en.resx | 3 + HandyControlDemo/Properties/Langs/Lang.resx | 3 + .../Resources/Themes/Styles/Style.xaml | 11 ++- .../UserControl/Controls/WindowDemoCtl.xaml | 1 + .../UserControl/Main/LeftMainContent.xaml | 11 +-- HandyControlDemo/Window/BlurWindow.xaml | 16 ++++ HandyControlDemo/Window/BlurWindow.xaml.cs | 10 +++ HandyControlDemo/Window/CommonWindow.xaml | 6 +- .../Window/CustomNonClientAreaWindow.xaml | 10 +-- README.md | 4 + Resources/BlurWindow.png | Bin 0 -> 98510 bytes 45 files changed, 387 insertions(+), 110 deletions(-) create mode 100644 HandyControl/Controls/Window/BlurWindow.cs rename HandyControl/Controls/Window/{WindowBorderless.cs => Window.cs} (91%) create mode 100644 HandyControl/Data/SystemVersionInfo.cs create mode 100644 HandyControl/Tools/Helper/CommonHelper.cs create mode 100644 HandyControlDemo/Window/BlurWindow.xaml create mode 100644 HandyControlDemo/Window/BlurWindow.xaml.cs create mode 100644 Resources/BlurWindow.png diff --git a/HandyControl/Controls/Attach/IconElement.cs b/HandyControl/Controls/Attach/IconElement.cs index 9a39bbc1..04fc803b 100644 --- a/HandyControl/Controls/Attach/IconElement.cs +++ b/HandyControl/Controls/Attach/IconElement.cs @@ -16,7 +16,7 @@ namespace HandyControl.Controls => (Geometry) element.GetValue(GeometryProperty); public static readonly DependencyProperty WidthProperty = DependencyProperty.RegisterAttached( - "Width", typeof(double), typeof(IconElement), new PropertyMetadata(ValueBoxes.Double0Box)); + "Width", typeof(double), typeof(IconElement), new PropertyMetadata(double.NaN)); public static void SetWidth(DependencyObject element, double value) => element.SetValue(WidthProperty, value); @@ -25,7 +25,7 @@ namespace HandyControl.Controls => (double) element.GetValue(WidthProperty); public static readonly DependencyProperty HeightProperty = DependencyProperty.RegisterAttached( - "Height", typeof(double), typeof(IconElement), new PropertyMetadata(ValueBoxes.Double0Box)); + "Height", typeof(double), typeof(IconElement), new PropertyMetadata(double.NaN)); public static void SetHeight(DependencyObject element, double value) => element.SetValue(HeightProperty, value); diff --git a/HandyControl/Controls/Attach/IconSwitchElement.cs b/HandyControl/Controls/Attach/IconSwitchElement.cs index 8bdcfb2d..714b2036 100644 --- a/HandyControl/Controls/Attach/IconSwitchElement.cs +++ b/HandyControl/Controls/Attach/IconSwitchElement.cs @@ -3,21 +3,8 @@ using System.Windows.Media; namespace HandyControl.Controls { - public class IconSwitchElement + public class IconSwitchElement : IconElement { - public static readonly DependencyProperty GeometryProperty = DependencyProperty.RegisterAttached( - "Geometry", typeof(Geometry), typeof(IconSwitchElement), new PropertyMetadata(default(Geometry))); - - public static void SetGeometry(DependencyObject element, Geometry value) - { - element.SetValue(GeometryProperty, value); - } - - public static Geometry GetGeometry(DependencyObject element) - { - return (Geometry)element.GetValue(GeometryProperty); - } - public static readonly DependencyProperty GeometrySelectedProperty = DependencyProperty.RegisterAttached( "GeometrySelected", typeof(Geometry), typeof(IconSwitchElement), new PropertyMetadata(default(Geometry))); diff --git a/HandyControl/Controls/Other/ColorPicker.cs b/HandyControl/Controls/Other/ColorPicker.cs index 648dc3c6..96e2020d 100644 --- a/HandyControl/Controls/Other/ColorPicker.cs +++ b/HandyControl/Controls/Other/ColorPicker.cs @@ -675,7 +675,7 @@ namespace HandyControl.Controls private void ButtonCancel_OnClick(object sender, RoutedEventArgs e) => RaiseEvent(new RoutedEventArgs(CanceledEvent)); - public void Dispose() => Window.GetWindow(this)?.Close(); + public void Dispose() => System.Windows.Window.GetWindow(this)?.Close(); public bool CanDispose { get; } = true; } diff --git a/HandyControl/Controls/Window/BlurWindow.cs b/HandyControl/Controls/Window/BlurWindow.cs new file mode 100644 index 00000000..44ec09d5 --- /dev/null +++ b/HandyControl/Controls/Window/BlurWindow.cs @@ -0,0 +1,53 @@ +using System.Runtime.InteropServices; +using System.Windows.Interop; +using HandyControl.Data; +using HandyControl.Tools; + +namespace HandyControl.Controls +{ + public class BlurWindow : Window + { + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + EnableBlur(this); + } + + 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) + { + accentPolicy.AccentState = ExternDllHelper.ACCENTSTATE.ACCENT_ENABLE_ACRYLICBLURBEHIND; + } + else if (versionInfo >= SystemVersionInfo.Windows10) + { + accentPolicy.AccentState = ExternDllHelper.ACCENTSTATE.ACCENT_ENABLE_BLURBEHIND; + } + else + { + accentPolicy.AccentState = ExternDllHelper.ACCENTSTATE.ACCENT_ENABLE_TRANSPARENTGRADIENT; + } + + accentPolicy.AccentFlags = 2; + accentPolicy.GradientColor = ResourceHelper.GetResource("BlurGradientValue"); + + var accentPtr = Marshal.AllocHGlobal(accentPolicySize); + Marshal.StructureToPtr(accentPolicy, accentPtr, false); + + var data = new ExternDllHelper.WINCOMPATTRDATA + { + Attribute = ExternDllHelper.WINDOWCOMPOSITIONATTRIB.WCA_ACCENT_POLICY, + DataSize = accentPolicySize, + Data = accentPtr + }; + + ExternDllHelper.SetWindowCompositionAttribute(new WindowInteropHelper(window).Handle, ref data); + + Marshal.FreeHGlobal(accentPtr); + } + } +} \ No newline at end of file diff --git a/HandyControl/Controls/Window/ImageBrowser.cs b/HandyControl/Controls/Window/ImageBrowser.cs index e74d9922..f5af1a8d 100644 --- a/HandyControl/Controls/Window/ImageBrowser.cs +++ b/HandyControl/Controls/Window/ImageBrowser.cs @@ -14,7 +14,7 @@ namespace HandyControl.Controls /// [TemplatePart(Name = ElementGridTop, Type = typeof(Grid))] [TemplatePart(Name = ElementImageViewer, Type = typeof(ImageViewer))] - public class ImageBrowser : WindowBorderless + public class ImageBrowser : Window { #region Constants diff --git a/HandyControl/Controls/Window/PopupWindow.cs b/HandyControl/Controls/Window/PopupWindow.cs index 833b75fe..f28418b9 100644 --- a/HandyControl/Controls/Window/PopupWindow.cs +++ b/HandyControl/Controls/Window/PopupWindow.cs @@ -15,7 +15,7 @@ namespace HandyControl.Controls /// [TemplatePart(Name = ElementMainBorder, Type = typeof(Border))] [TemplatePart(Name = ElementTitleBlock, Type = typeof(TextBlock))] - public class PopupWindow : Window + public class PopupWindow : System.Windows.Window { #region Constants @@ -98,7 +98,7 @@ namespace HandyControl.Controls } } - public PopupWindow(Window owner) : this() => Owner = owner; + public PopupWindow(System.Windows.Window owner) : this() => Owner = owner; private void CloseButton_OnClick(object sender, RoutedEventArgs e) => Close(); @@ -173,7 +173,7 @@ namespace HandyControl.Controls ShowDialog(); } - public void Show(Window element, Point point) + public void Show(System.Windows.Window element, Point point) { Left = element.Left + point.X; Top = element.Top + point.Y; diff --git a/HandyControl/Controls/Window/WindowBorderless.cs b/HandyControl/Controls/Window/Window.cs similarity index 91% rename from HandyControl/Controls/Window/WindowBorderless.cs rename to HandyControl/Controls/Window/Window.cs index f806468e..a4dc30a4 100644 --- a/HandyControl/Controls/Window/WindowBorderless.cs +++ b/HandyControl/Controls/Window/Window.cs @@ -14,71 +14,68 @@ using System.Windows.Shell; namespace HandyControl.Controls { - /// - /// 无边框窗口 - /// - public class WindowBorderless : Window + public class Window : System.Windows.Window { private Thickness _tempThickness; public static readonly DependencyProperty NonClientAreaContentProperty = DependencyProperty.Register( - "NonClientAreaContent", typeof(object), typeof(WindowBorderless), new PropertyMetadata(default(object))); + "NonClientAreaContent", typeof(object), typeof(Window), new PropertyMetadata(default(object))); public static readonly DependencyProperty CloseButtonHoverBackgroundProperty = DependencyProperty.Register( - "CloseButtonHoverBackground", typeof(Brush), typeof(WindowBorderless), + "CloseButtonHoverBackground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty CloseButtonHoverForegroundProperty = DependencyProperty.Register( - "CloseButtonHoverForeground", typeof(Brush), typeof(WindowBorderless), + "CloseButtonHoverForeground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty CloseButtonBackgroundProperty = DependencyProperty.Register( - "CloseButtonBackground", typeof(Brush), typeof(WindowBorderless), new PropertyMetadata(Brushes.Transparent)); + "CloseButtonBackground", typeof(Brush), typeof(Window), new PropertyMetadata(Brushes.Transparent)); public static readonly DependencyProperty CloseButtonForegroundProperty = DependencyProperty.Register( - "CloseButtonForeground", typeof(Brush), typeof(WindowBorderless), + "CloseButtonForeground", typeof(Brush), typeof(Window), new PropertyMetadata(Brushes.White)); public static readonly DependencyProperty OtherButtonBackgroundProperty = DependencyProperty.Register( - "OtherButtonBackground", typeof(Brush), typeof(WindowBorderless), new PropertyMetadata(Brushes.Transparent)); + "OtherButtonBackground", typeof(Brush), typeof(Window), new PropertyMetadata(Brushes.Transparent)); public static readonly DependencyProperty OtherButtonForegroundProperty = DependencyProperty.Register( - "OtherButtonForeground", typeof(Brush), typeof(WindowBorderless), + "OtherButtonForeground", typeof(Brush), typeof(Window), new PropertyMetadata(Brushes.White)); public static readonly DependencyProperty OtherButtonHoverBackgroundProperty = DependencyProperty.Register( - "OtherButtonHoverBackground", typeof(Brush), typeof(WindowBorderless), + "OtherButtonHoverBackground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty OtherButtonHoverForegroundProperty = DependencyProperty.Register( - "OtherButtonHoverForeground", typeof(Brush), typeof(WindowBorderless), + "OtherButtonHoverForeground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty NonClientAreaBackgroundProperty = DependencyProperty.Register( - "NonClientAreaBackground", typeof(Brush), typeof(WindowBorderless), + "NonClientAreaBackground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty NonClientAreaForegroundProperty = DependencyProperty.Register( - "NonClientAreaForeground", typeof(Brush), typeof(WindowBorderless), + "NonClientAreaForeground", typeof(Brush), typeof(Window), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty NonClientAreaHeightProperty = DependencyProperty.Register( - "NonClientAreaHeight", typeof(double), typeof(WindowBorderless), + "NonClientAreaHeight", typeof(double), typeof(Window), new PropertyMetadata(28.0)); public static readonly DependencyProperty ShowNonClientAreaProperty = DependencyProperty.Register( - "ShowNonClientArea", typeof(bool), typeof(WindowBorderless), new PropertyMetadata(ValueBoxes.TrueBox)); + "ShowNonClientArea", typeof(bool), typeof(Window), new PropertyMetadata(ValueBoxes.TrueBox)); public static readonly DependencyProperty ShowTitleProperty = DependencyProperty.Register( - "ShowTitle", typeof(bool), typeof(WindowBorderless), new PropertyMetadata(ValueBoxes.FalseBox)); + "ShowTitle", typeof(bool), typeof(Window), new PropertyMetadata(ValueBoxes.FalseBox)); public static readonly DependencyProperty IsFullScreenProperty = DependencyProperty.Register( - "IsFullScreen", typeof(bool), typeof(WindowBorderless), new PropertyMetadata(ValueBoxes.FalseBox, + "IsFullScreen", typeof(bool), typeof(Window), new PropertyMetadata(ValueBoxes.FalseBox, (o, args) => { - var ctl = (WindowBorderless)o; + var ctl = (Window)o; var v = (bool)args.NewValue; if (v) { @@ -99,7 +96,7 @@ namespace HandyControl.Controls } })); - public WindowBorderless() + public Window() { var chrome = new WindowChrome { @@ -277,11 +274,11 @@ namespace HandyControl.Controls /// 获取自定义窗口 /// /// - public static WindowBorderless GetCustomWindow(FrameworkElement content) + public static Window GetCustomWindow(FrameworkElement content) { - var window = new WindowBorderless + var window = new Window { - Style = ResourceHelper.GetResource - + + - + + - + + - + + + + diff --git a/HandyControlDemo/UserControl/Controls/WindowDemoCtl.xaml b/HandyControlDemo/UserControl/Controls/WindowDemoCtl.xaml index d719209c..ae0ca350 100644 --- a/HandyControlDemo/UserControl/Controls/WindowDemoCtl.xaml +++ b/HandyControlDemo/UserControl/Controls/WindowDemoCtl.xaml @@ -9,6 +9,7 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/README.md b/README.md index 5fd58e9c..3ca5cde8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ ## Latest examples +### BlurWindow + +![BlurWindow](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/BlurWindow.png) + ### FlipClock ![FlipClock](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/FlipClock.gif) diff --git a/Resources/BlurWindow.png b/Resources/BlurWindow.png new file mode 100644 index 0000000000000000000000000000000000000000..821cd44d4334e8257050d48276abf113f7da4143 GIT binary patch literal 98510 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�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 FV1gm!@FV~L literal 0 HcmV?d00001 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 002/141] 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 @@ + + + + + + + + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/Base/TreeViewBaseStyle.xaml b/HandyControl/Themes/Styles/Base/TreeViewBaseStyle.xaml new file mode 100644 index 00000000..63d2d8ab --- /dev/null +++ b/HandyControl/Themes/Styles/Base/TreeViewBaseStyle.xaml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/Shield.xaml b/HandyControl/Themes/Styles/Shield.xaml new file mode 100644 index 00000000..e4c62e4e --- /dev/null +++ b/HandyControl/Themes/Styles/Shield.xaml @@ -0,0 +1,11 @@ + + + + + + + + - - + - - - - - - - - \ No newline at end of file diff --git a/HandyControl/Tools/Helper/DesignerHelper.cs b/HandyControl/Tools/Helper/DesignerHelper.cs new file mode 100644 index 00000000..1f4d3416 --- /dev/null +++ b/HandyControl/Tools/Helper/DesignerHelper.cs @@ -0,0 +1,61 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace HandyControl.Tools +{ + public class DesignerHelper + { + public static bool IsInDesignMode() + { + try + { + var type1 = Type.GetType( + "System.ComponentModel.DesignerProperties, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); + if (type1 == null) + return false; + var obj1 = type1.GetTypeInfo().GetDeclaredField("IsInDesignModeProperty").GetValue(null); + var type2 = Type.GetType( + "System.ComponentModel.DependencyPropertyDescriptor, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); + var type3 = Type.GetType( + "System.Windows.FrameworkElement, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); + if (type2 == null || type3 == null) + return false; + var list = type2.GetTypeInfo().GetDeclaredMethods("FromProperty").ToList(); + if (list.Count == 0) + return false; + var methodInfo = list.FirstOrDefault(mi => + { + if (mi.IsPublic && mi.IsStatic) + return mi.GetParameters().Length == 2; + return false; + }); + if (methodInfo == null) + return false; + var obj2 = methodInfo.Invoke(null, new[] + { + obj1, + type3 + }); + if (obj2 == null) + return false; + var declaredProperty1 = type2.GetTypeInfo().GetDeclaredProperty("Metadata"); + if (declaredProperty1 == null) + return false; + var obj3 = declaredProperty1.GetValue(obj2, null); + var type4 = Type.GetType( + "System.Windows.PropertyMetadata, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); + if (obj3 == null || type4 == null) + return false; + var declaredProperty2 = type4.GetTypeInfo().GetDeclaredProperty("DefaultValue"); + if (declaredProperty2 == null) + return false; + return (bool) declaredProperty2.GetValue(obj3, null); + } + catch + { + return false; + } + } + } +} \ No newline at end of file diff --git a/HandyControlDemo/Data/MessageToken.cs b/HandyControlDemo/Data/MessageToken.cs index 588a5b6d..81585c04 100644 --- a/HandyControlDemo/Data/MessageToken.cs +++ b/HandyControlDemo/Data/MessageToken.cs @@ -66,6 +66,8 @@ public static readonly string RateDemoCtl = nameof(RateDemoCtl); + public static readonly string ShieldDemoCtl = nameof(ShieldDemoCtl); + public static readonly string ButtonDemoCtl = nameof(ButtonDemoCtl); public static readonly string ToggleButtonDemoCtl = nameof(ToggleButtonDemoCtl); diff --git a/HandyControlDemo/Data/MessageToken.tt b/HandyControlDemo/Data/MessageToken.tt index f9ae0db6..8d998ceb 100644 --- a/HandyControlDemo/Data/MessageToken.tt +++ b/HandyControlDemo/Data/MessageToken.tt @@ -35,7 +35,8 @@ var controlList = new List "FlipClockDemoCtl", "QQGroupView", "BlurWindow", - "RateDemoCtl" + "RateDemoCtl", + "ShieldDemoCtl" }; var styleList = new List { diff --git a/HandyControlDemo/HandyControlDemo.csproj b/HandyControlDemo/HandyControlDemo.csproj index 87384aa3..7b854b59 100644 --- a/HandyControlDemo/HandyControlDemo.csproj +++ b/HandyControlDemo/HandyControlDemo.csproj @@ -171,6 +171,9 @@ SearchBarDemoCtl.xaml + + ShieldDemoCtl.xaml + StepBarDemoCtl.xaml @@ -455,6 +458,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -647,6 +654,7 @@ TextTemplatingFileGenerator MessageToken.cs + diff --git a/HandyControlDemo/Properties/Langs/Lang.Designer.cs b/HandyControlDemo/Properties/Langs/Lang.Designer.cs index a4904768..37b055b6 100644 --- a/HandyControlDemo/Properties/Langs/Lang.Designer.cs +++ b/HandyControlDemo/Properties/Langs/Lang.Designer.cs @@ -825,6 +825,15 @@ namespace HandyControlDemo.Properties.Langs { } } + /// + /// 查找类似 徽章 的本地化字符串。 + /// + public static string Shield { + get { + return ResourceManager.GetString("Shield", resourceCulture); + } + } + /// /// 查找类似 显示行号 的本地化字符串。 /// diff --git a/HandyControlDemo/Properties/Langs/Lang.en.resx b/HandyControlDemo/Properties/Langs/Lang.en.resx index b3355a51..33e53c3e 100644 --- a/HandyControlDemo/Properties/Langs/Lang.en.resx +++ b/HandyControlDemo/Properties/Langs/Lang.en.resx @@ -447,4 +447,7 @@ Rate + + Shield + \ No newline at end of file diff --git a/HandyControlDemo/Properties/Langs/Lang.resx b/HandyControlDemo/Properties/Langs/Lang.resx index 218da9cf..f910452f 100644 --- a/HandyControlDemo/Properties/Langs/Lang.resx +++ b/HandyControlDemo/Properties/Langs/Lang.resx @@ -427,4 +427,7 @@ 评分 + + 徽章 + \ No newline at end of file diff --git a/HandyControlDemo/Resources/Img/LeftMainContent/Shield_16x.png b/HandyControlDemo/Resources/Img/LeftMainContent/Shield_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..9b30ef16baeea665ae4185077c998e4441319bb7 GIT binary patch literal 14673 zcmeI3TZkJ~7{^a7N?mB_ORd&o$7#J3P3DqYGbAbPX6vpr>$;6JTdj6>=45x+WM(=u z+ho@Yts-6!!D68nMNn+(gQ8d;M5IuxsP%$iRr(;*2SpKz7pS7No|(xeU$RM0D}6kH zWWGJ;|NXx+zjN7nnWsjE?^@iqq7NaocxW&`O0G-&@1kqS@2Wp8sN{03JvinfwB$qo zyI}tvOKwDH-5R4<@=Arxie^=#s&0+rXuWC^HA0#7bz9Y@u*Z$#3B%0tXWu`@bB3Pf zw~xt@G=1eVMvK464{uxq7u?x=KCE2fhl4{bqsZ0*N=3 z$e=tC8EiQCMHu{Djk&)sZ>05Cnt+iLJ(s@OpM4eB`zv)nQMIbTpx)t zj$T$q^P3vw$X{80((`OZ5Nfqrv=)n6&V(SP(`iAJ1zC;|MZ}#kJ+&S&-PNJVoKGIR znq%0WVVRuotBzaKUY6(mLd{R(zN&V!km)wq5sE@xwFN0E3f+=)t(jv_JC$H)x+dTX zu42=3NuJa-&z`hA%bm1(lx%kQEKKI4P-xcfI^JrvYiZXT*hLUDkao>q* zkn8UcRuy;qR>Rb-n!7e5bf&cCyXA)Ss)uv_dW?vPh@2`)F-1-(@l-@iDWV8WLS=_X z!P1TL4Dd)rWU(lTzDFz$J%F;)gX|w&_0&spfm-0BYf9O2s;ZYWs_Fz5Y;z(bv>Ji3 zxvG?Yt7181SU4BU2;G`NR6{IuyYkv^G~y!=5GkB zXN0!a*07qHjWpx`PGIN{(tFpaO=9z68!EI4RJ~1HtL)WO2XB}lYvNM&dg$7o)@h#+ z{L{Z;v`<9X+CD#XD|Y^TX8c1nBk%#f&zvM(xAo+7Zni{FkFxZHDIY zL5&$MDk3OgxF8K`%y3Z=K>@=BX;5Q^i;4&e7%oVI8Z%r}L{PwRK^oMU;i4jf0)`9H zpvDXr6%iCLT#yDeX1J(`pn&0mG^jDdMMVS!3>Tz9jTtT~A}CHeGi@3M6`#8 z@*9fv)1U2od+~8`>A=gc#(!J!g&f_x`OI|(uKMogg)5Ifcx&{XjSndMpBq{8{Ejt$ zomzJ8{Lr~$cdxzom8UnJnt4)MvS;j*#}66X(Ed^Wqji5iV&(N^)i+M0mmmG6`qG)5 zE8jc0@U^c`{(k(H`UGR)+9zm=57oYv<>VJp7fB29ge|ej^_t?SXt8UnR`s2Pu z+rQoU!S>_}rKzvBJ@Eto`tEm+e7e4%-h@h@kN)`2;f0IHkkQb + diff --git a/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml b/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml new file mode 100644 index 00000000..6676c3ef --- /dev/null +++ b/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml.cs b/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml.cs new file mode 100644 index 00000000..6cfbc669 --- /dev/null +++ b/HandyControlDemo/UserControl/Controls/ShieldDemoCtl.xaml.cs @@ -0,0 +1,10 @@ +namespace HandyControlDemo.UserControl +{ + public partial class ShieldDemoCtl + { + public ShieldDemoCtl() + { + InitializeComponent(); + } + } +} diff --git a/HandyControlDemo/UserControl/Main/LeftMainContent.xaml b/HandyControlDemo/UserControl/Main/LeftMainContent.xaml index 6b51a723..a208902f 100644 --- a/HandyControlDemo/UserControl/Main/LeftMainContent.xaml +++ b/HandyControlDemo/UserControl/Main/LeftMainContent.xaml @@ -200,6 +200,11 @@ + + + + + From bb94944991b9945d25a85525ed2212708455144c Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 27 Dec 2018 14:40:29 +0800 Subject: [PATCH 004/141] update readme --- README.md | 4 ++++ Resources/Shield.png | Bin 0 -> 2998 bytes 2 files changed, 4 insertions(+) create mode 100644 Resources/Shield.png diff --git a/README.md b/README.md index 6d0f0716..21f676ec 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ ![FlipClock](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/FlipClock.gif) +### Shield + +![Shield](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/Shield.png) + ## History publication ### OutlineText diff --git a/Resources/Shield.png b/Resources/Shield.png new file mode 100644 index 0000000000000000000000000000000000000000..9d77a7eb781565028ef157edba6b568a71103865 GIT binary patch literal 2998 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 UwM7x=g2w@RT85Z68V@7?15dDzeE Date: Thu, 27 Dec 2018 17:05:05 +0800 Subject: [PATCH 005/141] add AboutWindow --- HandyControl.sln | 10 ++++ .../Controls/{Other => Image}/GifImage.cs | 0 .../Controls/{Other => Image}/ImageViewer.cs | 0 HandyControl/Controls/Other/RadioGroup.cs | 9 --- .../Controls/{Other => Panel}/CirclePanel.cs | 0 HandyControl/Controls/Rate/Rate.cs | 2 +- HandyControl/Controls/Text/OutlineText.cs | 2 +- HandyControl/Controls/Window/Window.cs | 2 +- HandyControl/HandyControl.csproj | 39 ++++++++---- HandyControl/Tools/Helper/DesignerHelper.cs | 59 ++++--------------- HandyControlDemo/HandyControlDemo.csproj | 18 ++++++ .../UserControl/Main/NoUserContent.xaml | 1 + .../UserControl/Main/NoUserContent.xaml.cs | 9 +++ .../ViewModel/WindowDemoViewModel.cs | 2 + HandyControlDemo/Window/AboutWindow.xaml | 31 ++++++++++ HandyControlDemo/Window/AboutWindow.xaml.cs | 38 ++++++++++++ 16 files changed, 151 insertions(+), 71 deletions(-) rename HandyControl/Controls/{Other => Image}/GifImage.cs (100%) rename HandyControl/Controls/{Other => Image}/ImageViewer.cs (100%) rename HandyControl/Controls/{Other => Panel}/CirclePanel.cs (100%) create mode 100644 HandyControlDemo/Window/AboutWindow.xaml create mode 100644 HandyControlDemo/Window/AboutWindow.xaml.cs diff --git a/HandyControl.sln b/HandyControl.sln index a23bfefb..d8dca9bf 100644 --- a/HandyControl.sln +++ b/HandyControl.sln @@ -12,9 +12,11 @@ Global Debug|Any CPU = Debug|Any CPU Debug-Net40|Any CPU = Debug-Net40|Any CPU Debug-Net45|Any CPU = Debug-Net45|Any CPU + Debug-Net47|Any CPU = Debug-Net47|Any CPU Release|Any CPU = Release|Any CPU Release-Net40|Any CPU = Release-Net40|Any CPU Release-Net45|Any CPU = Release-Net45|Any CPU + Release-Net47|Any CPU = Release-Net47|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -23,24 +25,32 @@ Global {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug-Net40|Any CPU.Build.0 = Debug-Net40|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug-Net45|Any CPU.ActiveCfg = Debug-Net45|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug-Net45|Any CPU.Build.0 = Debug-Net45|Any CPU + {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug-Net47|Any CPU.ActiveCfg = Debug-Net47|Any CPU + {DC966E3D-BCFF-4652-98CF-070E5494749A}.Debug-Net47|Any CPU.Build.0 = Debug-Net47|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release|Any CPU.Build.0 = Release|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net40|Any CPU.ActiveCfg = Release-Net40|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net40|Any CPU.Build.0 = Release-Net40|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net45|Any CPU.ActiveCfg = Release-Net45|Any CPU {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net45|Any CPU.Build.0 = Release-Net45|Any CPU + {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net47|Any CPU.ActiveCfg = Release-Net47|Any CPU + {DC966E3D-BCFF-4652-98CF-070E5494749A}.Release-Net47|Any CPU.Build.0 = Release-Net47|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net40|Any CPU.ActiveCfg = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net40|Any CPU.Build.0 = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net45|Any CPU.ActiveCfg = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net45|Any CPU.Build.0 = Debug|Any CPU + {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net47|Any CPU.ActiveCfg = Debug|Any CPU + {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Debug-Net47|Any CPU.Build.0 = Debug|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release|Any CPU.Build.0 = Release|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net40|Any CPU.ActiveCfg = Release|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net40|Any CPU.Build.0 = Release|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net45|Any CPU.ActiveCfg = Release|Any CPU {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net45|Any CPU.Build.0 = Release|Any CPU + {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net47|Any CPU.ActiveCfg = Release-Net47|Any CPU + {9A7B52E6-94BB-4E7E-BB6A-7CF6761B79A7}.Release-Net47|Any CPU.Build.0 = Release-Net47|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/HandyControl/Controls/Other/GifImage.cs b/HandyControl/Controls/Image/GifImage.cs similarity index 100% rename from HandyControl/Controls/Other/GifImage.cs rename to HandyControl/Controls/Image/GifImage.cs diff --git a/HandyControl/Controls/Other/ImageViewer.cs b/HandyControl/Controls/Image/ImageViewer.cs similarity index 100% rename from HandyControl/Controls/Other/ImageViewer.cs rename to HandyControl/Controls/Image/ImageViewer.cs diff --git a/HandyControl/Controls/Other/RadioGroup.cs b/HandyControl/Controls/Other/RadioGroup.cs index 86f957f7..97b9bc38 100644 --- a/HandyControl/Controls/Other/RadioGroup.cs +++ b/HandyControl/Controls/Other/RadioGroup.cs @@ -10,15 +10,6 @@ namespace HandyControl.Controls protected override bool IsItemItsOwnContainerOverride(object item) => item is RadioButton; - //public static readonly DependencyProperty GroupNameProperty = DependencyProperty.Register( - // "GroupName", typeof(string), typeof(RadioGroup), new PropertyMetadata(default(string))); - - //public string GroupName - //{ - // get => (string) GetValue(GroupNameProperty); - // set => SetValue(GroupNameProperty, value); - //} - public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register( "Orientation", typeof(Orientation), typeof(RadioGroup), new PropertyMetadata(default(Orientation))); diff --git a/HandyControl/Controls/Other/CirclePanel.cs b/HandyControl/Controls/Panel/CirclePanel.cs similarity index 100% rename from HandyControl/Controls/Other/CirclePanel.cs rename to HandyControl/Controls/Panel/CirclePanel.cs diff --git a/HandyControl/Controls/Rate/Rate.cs b/HandyControl/Controls/Rate/Rate.cs index d41d3256..d35524f0 100644 --- a/HandyControl/Controls/Rate/Rate.cs +++ b/HandyControl/Controls/Rate/Rate.cs @@ -52,7 +52,7 @@ namespace HandyControl.Controls Loaded += (s, e) => { - if (DesignerHelper.IsInDesignMode()) return; + if (DesignerHelper.IsInDesignMode) return; if (_isLoaded) return; _isLoaded = true; if (Value <= 0) diff --git a/HandyControl/Controls/Text/OutlineText.cs b/HandyControl/Controls/Text/OutlineText.cs index 9cd6c36f..be9022c9 100644 --- a/HandyControl/Controls/Text/OutlineText.cs +++ b/HandyControl/Controls/Text/OutlineText.cs @@ -153,7 +153,7 @@ namespace HandyControl.Controls return; } -#if net45 || net40 +#if netle45 _formattedText = new FormattedText( Text, CultureInfo.CurrentUICulture, diff --git a/HandyControl/Controls/Window/Window.cs b/HandyControl/Controls/Window/Window.cs index a4dc30a4..daa24f1a 100644 --- a/HandyControl/Controls/Window/Window.cs +++ b/HandyControl/Controls/Window/Window.cs @@ -6,7 +6,7 @@ using System.Windows.Input; using System.Windows.Media; using HandyControl.Data; using HandyControl.Tools; -#if net40 +#if netle40 using Microsoft.Windows.Shell; #else using System.Windows.Shell; diff --git a/HandyControl/HandyControl.csproj b/HandyControl/HandyControl.csproj index 5a45f7e2..4b9efcc6 100644 --- a/HandyControl/HandyControl.csproj +++ b/HandyControl/HandyControl.csproj @@ -26,12 +26,23 @@ v4.6.2 netgt40 + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + v4.7 + netgt40 + true full false bin\Debug\ - DEBUG;TRACE;net45 + DEBUG;TRACE;netle45 prompt 4 v4.5 @@ -42,7 +53,7 @@ full false bin\Debug\ - DEBUG;TRACE;net40 + DEBUG;TRACE;netle45;netle40 prompt 4 v4.0 @@ -59,11 +70,22 @@ v4.6.2 netgt40 + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\HandyControl.xml + v4.7 + netgt40 + pdbonly true bin\Release\ - TRACE;net45 + TRACE;netle45 prompt 4 bin\Release\HandyControl.xml @@ -74,7 +96,7 @@ pdbonly true bin\Release\ - TRACE;net40 + TRACE;netle45;netle40 prompt 4 bin\Release\HandyControl.xml @@ -108,14 +130,14 @@ - + - + @@ -123,7 +145,7 @@ - + @@ -721,9 +743,6 @@ - - - diff --git a/HandyControl/Tools/Helper/DesignerHelper.cs b/HandyControl/Tools/Helper/DesignerHelper.cs index 1f4d3416..7a92c9a0 100644 --- a/HandyControl/Tools/Helper/DesignerHelper.cs +++ b/HandyControl/Tools/Helper/DesignerHelper.cs @@ -1,60 +1,21 @@ -using System; -using System.Linq; -using System.Reflection; +using System.ComponentModel; +using System.Windows; namespace HandyControl.Tools { public class DesignerHelper { - public static bool IsInDesignMode() + private static bool? _isInDesignMode; + + public static bool IsInDesignMode { - try + get { - var type1 = Type.GetType( - "System.ComponentModel.DesignerProperties, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); - if (type1 == null) - return false; - var obj1 = type1.GetTypeInfo().GetDeclaredField("IsInDesignModeProperty").GetValue(null); - var type2 = Type.GetType( - "System.ComponentModel.DependencyPropertyDescriptor, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); - var type3 = Type.GetType( - "System.Windows.FrameworkElement, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); - if (type2 == null || type3 == null) - return false; - var list = type2.GetTypeInfo().GetDeclaredMethods("FromProperty").ToList(); - if (list.Count == 0) - return false; - var methodInfo = list.FirstOrDefault(mi => + if (!_isInDesignMode.HasValue) { - if (mi.IsPublic && mi.IsStatic) - return mi.GetParameters().Length == 2; - return false; - }); - if (methodInfo == null) - return false; - var obj2 = methodInfo.Invoke(null, new[] - { - obj1, - type3 - }); - if (obj2 == null) - return false; - var declaredProperty1 = type2.GetTypeInfo().GetDeclaredProperty("Metadata"); - if (declaredProperty1 == null) - return false; - var obj3 = declaredProperty1.GetValue(obj2, null); - var type4 = Type.GetType( - "System.Windows.PropertyMetadata, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); - if (obj3 == null || type4 == null) - return false; - var declaredProperty2 = type4.GetTypeInfo().GetDeclaredProperty("DefaultValue"); - if (declaredProperty2 == null) - return false; - return (bool) declaredProperty2.GetValue(obj3, null); - } - catch - { - return false; + _isInDesignMode = (bool)DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty, typeof(FrameworkElement)).Metadata.DefaultValue; + } + return _isInDesignMode.Value; } } } diff --git a/HandyControlDemo/HandyControlDemo.csproj b/HandyControlDemo/HandyControlDemo.csproj index 7b854b59..28172c88 100644 --- a/HandyControlDemo/HandyControlDemo.csproj +++ b/HandyControlDemo/HandyControlDemo.csproj @@ -37,6 +37,16 @@ 4 v4.6.2 + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + v4.7 + Resources\Img\icon.ico @@ -297,6 +307,9 @@ + + AboutWindow.xaml + BlurWindow.xaml @@ -614,6 +627,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -718,6 +735,7 @@ + diff --git a/HandyControlDemo/UserControl/Main/NoUserContent.xaml b/HandyControlDemo/UserControl/Main/NoUserContent.xaml index 80dd2517..c4b36c88 100644 --- a/HandyControlDemo/UserControl/Main/NoUserContent.xaml +++ b/HandyControlDemo/UserControl/Main/NoUserContent.xaml @@ -56,6 +56,7 @@ + diff --git a/HandyControlDemo/UserControl/Main/NoUserContent.xaml.cs b/HandyControlDemo/UserControl/Main/NoUserContent.xaml.cs index cd06d767..efa015e0 100644 --- a/HandyControlDemo/UserControl/Main/NoUserContent.xaml.cs +++ b/HandyControlDemo/UserControl/Main/NoUserContent.xaml.cs @@ -8,6 +8,7 @@ using HandyControl.Controls; using HandyControl.Data; using HandyControlDemo.Data; using HandyControlDemo.Tools; +using HandyControlDemo.Window; // ReSharper disable once CheckNamespace namespace HandyControlDemo.UserControl @@ -72,5 +73,13 @@ namespace HandyControlDemo.UserControl Messenger.Default.Send(true, MessageToken.FullSwitch); Messenger.Default.Send(AssemblyHelper.CreateInternalInstance($"UserControl.{MessageToken.ContributorsView}"), MessageToken.LoadShowContent); } + + private void MenuAbout_OnClick(object sender, RoutedEventArgs e) + { + new AboutWindow + { + Owner = Application.Current.MainWindow + }.ShowDialog(); + } } } diff --git a/HandyControlDemo/ViewModel/WindowDemoViewModel.cs b/HandyControlDemo/ViewModel/WindowDemoViewModel.cs index 3c251ddb..9e694c94 100644 --- a/HandyControlDemo/ViewModel/WindowDemoViewModel.cs +++ b/HandyControlDemo/ViewModel/WindowDemoViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Windows; using GalaSoft.MvvmLight.CommandWpf; using HandyControlDemo.Tools; @@ -12,6 +13,7 @@ namespace HandyControlDemo.ViewModel { if (AssemblyHelper.CreateInternalInstance($"Window.{windowTag}") is System.Windows.Window window) { + window.Owner = Application.Current.MainWindow; window.ShowDialog(); } } diff --git a/HandyControlDemo/Window/AboutWindow.xaml b/HandyControlDemo/Window/AboutWindow.xaml new file mode 100644 index 00000000..63b0d8ab --- /dev/null +++ b/HandyControlDemo/Window/AboutWindow.xaml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/HandyControlDemo/Window/AboutWindow.xaml.cs b/HandyControlDemo/Window/AboutWindow.xaml.cs new file mode 100644 index 00000000..3b465a63 --- /dev/null +++ b/HandyControlDemo/Window/AboutWindow.xaml.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using System.Reflection; +using System.Windows; + +namespace HandyControlDemo.Window +{ + public partial class AboutWindow + { + public AboutWindow() + { + InitializeComponent(); + + DataContext = this; + + var versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location); + CopyRight = versionInfo.LegalCopyright; + Version = $"v {versionInfo.FileVersion}"; + } + + public static readonly DependencyProperty CopyRightProperty = DependencyProperty.Register( + "CopyRight", typeof(string), typeof(AboutWindow), new PropertyMetadata(default(string))); + + public string CopyRight + { + get => (string) GetValue(CopyRightProperty); + set => SetValue(CopyRightProperty, value); + } + + public static readonly DependencyProperty VersionProperty = DependencyProperty.Register( + "Version", typeof(string), typeof(AboutWindow), new PropertyMetadata(default(string))); + + public string Version + { + get => (string) GetValue(VersionProperty); + set => SetValue(VersionProperty, value); + } + } +} From c2f26ae94229e9c7057147c767e88887637c07e1 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 27 Dec 2018 17:22:33 +0800 Subject: [PATCH 006/141] remove app.config --- HandyControlDemo/HandyControlDemo.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/HandyControlDemo/HandyControlDemo.csproj b/HandyControlDemo/HandyControlDemo.csproj index 28172c88..2d912289 100644 --- a/HandyControlDemo/HandyControlDemo.csproj +++ b/HandyControlDemo/HandyControlDemo.csproj @@ -735,7 +735,6 @@ - From 3857ac2d53240cb11e418be3bd19fa1e8dfa8b51 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Fri, 28 Dec 2018 00:14:09 +0800 Subject: [PATCH 007/141] add WaterfallPanel --- HandyControl/Controls/Panel/WaterfallPanel.cs | 85 ++++++++++++++++++ HandyControl/Data/ValueBoxes.cs | 2 + HandyControl/HandyControl.csproj | 1 + HandyControlDemo/Data/MessageToken.cs | 2 + HandyControlDemo/Data/MessageToken.tt | 3 +- HandyControlDemo/HandyControlDemo.csproj | 8 ++ .../Properties/Langs/Lang.Designer.cs | 20 ++++- .../Properties/Langs/Lang.en.resx | 6 ++ HandyControlDemo/Properties/Langs/Lang.resx | 6 ++ .../Img/LeftMainContent/Panel_16x.png | Bin 0 -> 139 bytes .../Controls/WaterfallPanelDemoCtl.xaml | 77 ++++++++++++++++ .../Controls/WaterfallPanelDemoCtl.xaml.cs | 10 +++ .../UserControl/Main/LeftMainContent.xaml | 5 ++ README.md | 4 + Resources/WaterfallPanel.png | Bin 0 -> 14244 bytes 15 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 HandyControl/Controls/Panel/WaterfallPanel.cs create mode 100644 HandyControlDemo/Resources/Img/LeftMainContent/Panel_16x.png create mode 100644 HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml create mode 100644 HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml.cs create mode 100644 Resources/WaterfallPanel.png diff --git a/HandyControl/Controls/Panel/WaterfallPanel.cs b/HandyControl/Controls/Panel/WaterfallPanel.cs new file mode 100644 index 00000000..2ddb6ffa --- /dev/null +++ b/HandyControl/Controls/Panel/WaterfallPanel.cs @@ -0,0 +1,85 @@ +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using HandyControl.Data; + +namespace HandyControl.Controls +{ + public class WaterfallPanel : Panel + { + public static readonly DependencyProperty GroupsProperty = DependencyProperty.Register( + "Groups", typeof(int), typeof(WaterfallPanel), new FrameworkPropertyMetadata(ValueBoxes.Int2Box, FrameworkPropertyMetadataOptions.AffectsMeasure), IsGroupsValid); + + public int Groups + { + get => (int) GetValue(GroupsProperty); + set => SetValue(GroupsProperty, value); + } + + private static bool IsGroupsValid(object value) + { + var v = (int)value; + return v >= 1; + } + + public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register( + "Orientation", typeof(Orientation), typeof(WaterfallPanel), new FrameworkPropertyMetadata( + Orientation.Horizontal, FrameworkPropertyMetadataOptions.AffectsMeasure)); + + public Orientation Orientation + { + get => (Orientation) GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + protected override Size MeasureOverride(Size constraint) + { + if (Groups < 1) return constraint; + var children = InternalChildren; + Size panelSize; + + if (Orientation == Orientation.Horizontal) + { + var heightArr = new double[Groups].ToList(); + var itemWidth = constraint.Width / Groups; + if (double.IsNaN(itemWidth) || double.IsInfinity(itemWidth)) return constraint; + + for (int i = 0, count = children.Count; i < count; i++) + { + var child = children[i]; + if (child == null) continue; + + child.Measure(constraint); + var minIndex = heightArr.IndexOf(heightArr.Min()); + var minY = heightArr[minIndex]; + child.Arrange(new Rect(new Point(minIndex * itemWidth, minY), new Size(itemWidth, child.DesiredSize.Height))); + + heightArr[minIndex] = minY + child.DesiredSize.Height; + } + panelSize = new Size(constraint.Width, heightArr.Max()); + } + else + { + var widthArr = new double[Groups].ToList(); + var itemHeight = constraint.Height / Groups; + if (double.IsNaN(itemHeight) || double.IsInfinity(itemHeight)) return constraint; + + for (int i = 0, count = children.Count; i < count; i++) + { + var child = children[i]; + if (child == null) continue; + + child.Measure(constraint); + var minIndex = widthArr.IndexOf(widthArr.Min()); + var minX = widthArr[minIndex]; + child.Arrange(new Rect(new Point(minX, minIndex * itemHeight), new Size(child.DesiredSize.Width, itemHeight))); + + widthArr[minIndex] = minX + child.DesiredSize.Width; + } + panelSize = new Size(widthArr.Max(), constraint.Height); + } + + return panelSize; + } + } +} \ No newline at end of file diff --git a/HandyControl/Data/ValueBoxes.cs b/HandyControl/Data/ValueBoxes.cs index 63599e41..4536ee0d 100644 --- a/HandyControl/Data/ValueBoxes.cs +++ b/HandyControl/Data/ValueBoxes.cs @@ -23,6 +23,8 @@ internal static object Int1Box = 1; + internal static object Int2Box = 2; + internal static object Int5Box = 5; internal static object BooleanBox(bool value) => value ? TrueBox : FalseBox; diff --git a/HandyControl/HandyControl.csproj b/HandyControl/HandyControl.csproj index 4b9efcc6..69ec2637 100644 --- a/HandyControl/HandyControl.csproj +++ b/HandyControl/HandyControl.csproj @@ -134,6 +134,7 @@ + diff --git a/HandyControlDemo/Data/MessageToken.cs b/HandyControlDemo/Data/MessageToken.cs index 81585c04..51a59bfe 100644 --- a/HandyControlDemo/Data/MessageToken.cs +++ b/HandyControlDemo/Data/MessageToken.cs @@ -68,6 +68,8 @@ public static readonly string ShieldDemoCtl = nameof(ShieldDemoCtl); + public static readonly string WaterfallPanelDemoCtl = nameof(WaterfallPanelDemoCtl); + public static readonly string ButtonDemoCtl = nameof(ButtonDemoCtl); public static readonly string ToggleButtonDemoCtl = nameof(ToggleButtonDemoCtl); diff --git a/HandyControlDemo/Data/MessageToken.tt b/HandyControlDemo/Data/MessageToken.tt index 8d998ceb..5ea16e51 100644 --- a/HandyControlDemo/Data/MessageToken.tt +++ b/HandyControlDemo/Data/MessageToken.tt @@ -36,7 +36,8 @@ var controlList = new List "QQGroupView", "BlurWindow", "RateDemoCtl", - "ShieldDemoCtl" + "ShieldDemoCtl", + "WaterfallPanelDemoCtl" }; var styleList = new List { diff --git a/HandyControlDemo/HandyControlDemo.csproj b/HandyControlDemo/HandyControlDemo.csproj index 2d912289..16ec2be7 100644 --- a/HandyControlDemo/HandyControlDemo.csproj +++ b/HandyControlDemo/HandyControlDemo.csproj @@ -196,6 +196,9 @@ TimePickerDemoCtl.xaml + + WaterfallPanelDemoCtl.xaml + WindowDemoCtl.xaml @@ -491,6 +494,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -671,6 +678,7 @@ TextTemplatingFileGenerator MessageToken.cs + diff --git a/HandyControlDemo/Properties/Langs/Lang.Designer.cs b/HandyControlDemo/Properties/Langs/Lang.Designer.cs index 37b055b6..643b06b1 100644 --- a/HandyControlDemo/Properties/Langs/Lang.Designer.cs +++ b/HandyControlDemo/Properties/Langs/Lang.Designer.cs @@ -47,7 +47,7 @@ namespace HandyControlDemo.Properties.Langs { } /// - /// 重写当前线程的 CurrentUICulture 属性 + /// 使用此强类型资源类,为所有资源查找 /// 重写当前线程的 CurrentUICulture 属性。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] @@ -411,6 +411,15 @@ namespace HandyControlDemo.Properties.Langs { } } + /// + /// 查找类似 组数 的本地化字符串。 + /// + public static string Groups { + get { + return ResourceManager.GetString("Groups", resourceCulture); + } + } + /// /// 查找类似 信息通知 的本地化字符串。 /// @@ -1050,6 +1059,15 @@ namespace HandyControlDemo.Properties.Langs { } } + /// + /// 查找类似 瀑布流 的本地化字符串。 + /// + public static string WaterfallPanel { + get { + return ResourceManager.GetString("WaterfallPanel", resourceCulture); + } + } + /// /// 查找类似 窗口 的本地化字符串。 /// diff --git a/HandyControlDemo/Properties/Langs/Lang.en.resx b/HandyControlDemo/Properties/Langs/Lang.en.resx index 33e53c3e..faf3af75 100644 --- a/HandyControlDemo/Properties/Langs/Lang.en.resx +++ b/HandyControlDemo/Properties/Langs/Lang.en.resx @@ -450,4 +450,10 @@ Shield + + WaterfallPanel + + + Groups + \ No newline at end of file diff --git a/HandyControlDemo/Properties/Langs/Lang.resx b/HandyControlDemo/Properties/Langs/Lang.resx index f910452f..0bfff05e 100644 --- a/HandyControlDemo/Properties/Langs/Lang.resx +++ b/HandyControlDemo/Properties/Langs/Lang.resx @@ -430,4 +430,10 @@ 徽章 + + 瀑布流 + + + 组数 + \ No newline at end of file diff --git a/HandyControlDemo/Resources/Img/LeftMainContent/Panel_16x.png b/HandyControlDemo/Resources/Img/LeftMainContent/Panel_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c87bed249b669f3e9fb4f3d3db1e5954be11e45 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMprEa% zi(^Pd+}p{9Tnq|4%%8XY`LBOfb@ii1N=~_j*$-Zn-3eObDHXV_;feP01(Dy2L@VCU iZ_--P^he*tu}oP0)d>|Z- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml.cs b/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml.cs new file mode 100644 index 00000000..3e9c2468 --- /dev/null +++ b/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml.cs @@ -0,0 +1,10 @@ +namespace HandyControlDemo.UserControl +{ + public partial class WaterfallPanelDemoCtl + { + public WaterfallPanelDemoCtl() + { + InitializeComponent(); + } + } +} diff --git a/HandyControlDemo/UserControl/Main/LeftMainContent.xaml b/HandyControlDemo/UserControl/Main/LeftMainContent.xaml index a208902f..e06f55e4 100644 --- a/HandyControlDemo/UserControl/Main/LeftMainContent.xaml +++ b/HandyControlDemo/UserControl/Main/LeftMainContent.xaml @@ -230,6 +230,11 @@ + + + + + diff --git a/README.md b/README.md index 21f676ec..ca049076 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ ## Latest examples +### WaterfallPanel + +![WaterfallPanel](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/WaterfallPanel.png) + ### Rate ![Rate](https://raw.githubusercontent.com/NaBian/HandyControl/master/Resources/Rate.png) diff --git a/Resources/WaterfallPanel.png b/Resources/WaterfallPanel.png new file mode 100644 index 0000000000000000000000000000000000000000..3448f06e91253fc8b6772785fc125387d088879f GIT binary patch literal 14244 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 literal 0 HcmV?d00001 From 15d96290ad3b40defd01d46e9dd08ea09495fbd7 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Fri, 28 Dec 2018 16:47:35 +0800 Subject: [PATCH 008/141] add PanelElement --- HandyControl/Controls/Attach/LinkElement.cs | 9 ++-- HandyControl/Controls/Attach/PanelElement.cs | 44 +++++++++++++++++ HandyControl/Data/ValueBoxes.cs | 2 + HandyControl/HandyControl.csproj | 5 ++ HandyControl/Themes/Basic/Basic.xaml | 1 + HandyControl/Themes/Basic/Behaviors.xaml | 47 +++++++++++++++++++ .../Controls/WaterfallPanelDemoCtl.xaml | 12 +---- 7 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 HandyControl/Controls/Attach/PanelElement.cs create mode 100644 HandyControl/Themes/Basic/Behaviors.xaml diff --git a/HandyControl/Controls/Attach/LinkElement.cs b/HandyControl/Controls/Attach/LinkElement.cs index 90bd8053..5da5d111 100644 --- a/HandyControl/Controls/Attach/LinkElement.cs +++ b/HandyControl/Controls/Attach/LinkElement.cs @@ -29,11 +29,10 @@ namespace HandyControl.Controls private static void CreateTrriger(UIElement element, string link) { - if (string.IsNullOrEmpty(link)) - { - element.CommandBindings.Remove(GetCommandBinding(element)); - return; - } + element.CommandBindings.Remove(GetCommandBinding(element)); + element.SetCurrentValue(CommandBindingProperty, DependencyProperty.UnsetValue); + + if (string.IsNullOrEmpty(link)) return; var commandBinding = new CommandBinding(ControlCommands.OpenLink, (sender, args) => Process.Start(link)); SetCommandBinding(element, commandBinding); element.CommandBindings.Add(commandBinding); diff --git a/HandyControl/Controls/Attach/PanelElement.cs b/HandyControl/Controls/Attach/PanelElement.cs new file mode 100644 index 00000000..f1788378 --- /dev/null +++ b/HandyControl/Controls/Attach/PanelElement.cs @@ -0,0 +1,44 @@ +using System.Windows; +using System.Windows.Controls; +using HandyControl.Interactivity; + +namespace HandyControl.Controls +{ + public class PanelElement + { + public static readonly DependencyProperty FluidMoveBehaviorProperty = DependencyProperty.RegisterAttached( + "FluidMoveBehavior", typeof(FluidMoveBehavior), typeof(PanelElement), new PropertyMetadata(default(FluidMoveBehavior), OnFluidMoveBehaviorChanged)); + + private static void OnFluidMoveBehaviorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is Panel panel) + { + var collection = Interaction.GetBehaviors(panel); + var oldBehavior = GetTempFluidMoveBehavior(panel); + collection.Remove(oldBehavior); + panel.SetCurrentValue(TempFluidMoveBehaviorProperty, DependencyProperty.UnsetValue); + + if (e.NewValue is FluidMoveBehavior behavior) + { + collection.Add(behavior); + SetTempFluidMoveBehavior(panel, behavior); + } + } + } + + public static void SetFluidMoveBehavior(DependencyObject element, FluidMoveBehavior value) + => element.SetValue(FluidMoveBehaviorProperty, value); + + public static FluidMoveBehavior GetFluidMoveBehavior(DependencyObject element) + => (FluidMoveBehavior) element.GetValue(FluidMoveBehaviorProperty); + + private static readonly DependencyProperty TempFluidMoveBehaviorProperty = DependencyProperty.RegisterAttached( + "TempFluidMoveBehavior", typeof(FluidMoveBehavior), typeof(PanelElement), new PropertyMetadata(default(FluidMoveBehavior))); + + private static void SetTempFluidMoveBehavior(DependencyObject element, FluidMoveBehavior value) + => element.SetValue(TempFluidMoveBehaviorProperty, value); + + private static FluidMoveBehavior GetTempFluidMoveBehavior(DependencyObject element) + => (FluidMoveBehavior) element.GetValue(TempFluidMoveBehaviorProperty); + } +} \ No newline at end of file diff --git a/HandyControl/Data/ValueBoxes.cs b/HandyControl/Data/ValueBoxes.cs index 4536ee0d..9954517f 100644 --- a/HandyControl/Data/ValueBoxes.cs +++ b/HandyControl/Data/ValueBoxes.cs @@ -17,6 +17,8 @@ internal static object Double100Box = 100.0; + internal static object Double200Box = 200.0; + internal static object DoubleNeg1Box = -1.0; internal static object Int0Box = 0; diff --git a/HandyControl/HandyControl.csproj b/HandyControl/HandyControl.csproj index 69ec2637..193d91ea 100644 --- a/HandyControl/HandyControl.csproj +++ b/HandyControl/HandyControl.csproj @@ -115,6 +115,7 @@ + @@ -322,6 +323,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/HandyControl/Themes/Basic/Basic.xaml b/HandyControl/Themes/Basic/Basic.xaml index 38b5f704..812f0ae2 100644 --- a/HandyControl/Themes/Basic/Basic.xaml +++ b/HandyControl/Themes/Basic/Basic.xaml @@ -9,6 +9,7 @@ + diff --git a/HandyControl/Themes/Basic/Behaviors.xaml b/HandyControl/Themes/Basic/Behaviors.xaml new file mode 100644 index 00000000..b6454e91 --- /dev/null +++ b/HandyControl/Themes/Basic/Behaviors.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml b/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml index e6a4b020..a0bc7675 100644 --- a/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml +++ b/HandyControlDemo/UserControl/Controls/WaterfallPanelDemoCtl.xaml @@ -14,17 +14,7 @@ - - - - - - - - - - - + From 912a10b56de0f17f41ae86ca0743c601f0d4ce76 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Sat, 29 Dec 2018 13:33:33 +0800 Subject: [PATCH 009/141] ready for coverview --- HandyControl/Controls/CoverView/CoverView.cs | 9 +++++++++ .../Controls/CoverView/CoverViewItem.cs | 9 +++++++++ HandyControl/Controls/Other/ScrollViewer.cs | 15 +++++++++++++-- HandyControl/HandyControl.csproj | 10 ++++++++++ .../Themes/Styles/Base/CoverViewBaseStyle.xaml | 13 +++++++++++++ HandyControl/Themes/Styles/CoverView.xaml | 4 ++++ HandyControl/Themes/Styles/Style.xaml | 1 + HandyControlDemo/Data/MessageToken.cs | 2 ++ HandyControlDemo/Data/MessageToken.tt | 3 ++- HandyControlDemo/HandyControlDemo.csproj | 8 ++++++++ .../Properties/Langs/Lang.Designer.cs | 11 ++++++++++- HandyControlDemo/Properties/Langs/Lang.en.resx | 3 +++ HandyControlDemo/Properties/Langs/Lang.resx | 3 +++ .../Img/LeftMainContent/DetailDataView_16x.png | Bin 0 -> 129 bytes .../UserControl/Controls/CoverViewDemoCtl.xaml | 13 +++++++++++++ .../Controls/CoverViewDemoCtl.xaml.cs | 10 ++++++++++ .../Controls/WaterfallPanelDemoCtl.xaml | 16 +++------------- .../UserControl/Main/LeftMainContent.xaml | 5 +++++ 18 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 HandyControl/Controls/CoverView/CoverView.cs create mode 100644 HandyControl/Controls/CoverView/CoverViewItem.cs create mode 100644 HandyControl/Themes/Styles/Base/CoverViewBaseStyle.xaml create mode 100644 HandyControl/Themes/Styles/CoverView.xaml create mode 100644 HandyControlDemo/Resources/Img/LeftMainContent/DetailDataView_16x.png create mode 100644 HandyControlDemo/UserControl/Controls/CoverViewDemoCtl.xaml create mode 100644 HandyControlDemo/UserControl/Controls/CoverViewDemoCtl.xaml.cs diff --git a/HandyControl/Controls/CoverView/CoverView.cs b/HandyControl/Controls/CoverView/CoverView.cs new file mode 100644 index 00000000..72d529b4 --- /dev/null +++ b/HandyControl/Controls/CoverView/CoverView.cs @@ -0,0 +1,9 @@ +using System.Windows.Controls; + +namespace HandyControl.Controls +{ + public class CoverView : ItemsControl + { + + } +} \ No newline at end of file diff --git a/HandyControl/Controls/CoverView/CoverViewItem.cs b/HandyControl/Controls/CoverView/CoverViewItem.cs new file mode 100644 index 00000000..ee9cc718 --- /dev/null +++ b/HandyControl/Controls/CoverView/CoverViewItem.cs @@ -0,0 +1,9 @@ +using System.Windows.Controls; + +namespace HandyControl.Controls +{ + public class CoverViewItem : HeaderedContentControl + { + + } +} \ No newline at end of file diff --git a/HandyControl/Controls/Other/ScrollViewer.cs b/HandyControl/Controls/Other/ScrollViewer.cs index a2fdaccd..823e66fc 100644 --- a/HandyControl/Controls/Other/ScrollViewer.cs +++ b/HandyControl/Controls/Other/ScrollViewer.cs @@ -49,14 +49,25 @@ namespace HandyControl.Controls protected override void OnMouseWheel(MouseWheelEventArgs e) { + if (!CanMouseWheel) return; + if (!IsEnableInertia) { - base.OnMouseWheel(e); + if (Orientation == Orientation.Vertical) + { + base.OnMouseWheel(e); + } + else + { + _totalHorizontalOffset = HorizontalOffset; + CurrentHorizontalOffset = HorizontalOffset; + _totalHorizontalOffset = Math.Min(Math.Max(0, _totalHorizontalOffset - e.Delta), ScrollableWidth); + CurrentHorizontalOffset = _totalHorizontalOffset; + } return; } e.Handled = true; - if (!CanMouseWheel) return; if (Orientation == Orientation.Vertical) { if (!_isRunning) diff --git a/HandyControl/HandyControl.csproj b/HandyControl/HandyControl.csproj index 193d91ea..ee5de855 100644 --- a/HandyControl/HandyControl.csproj +++ b/HandyControl/HandyControl.csproj @@ -117,6 +117,7 @@ + @@ -131,6 +132,7 @@ + @@ -375,6 +377,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -407,6 +413,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/HandyControl/Themes/Styles/Base/CoverViewBaseStyle.xaml b/HandyControl/Themes/Styles/Base/CoverViewBaseStyle.xaml new file mode 100644 index 00000000..3e872520 --- /dev/null +++ b/HandyControl/Themes/Styles/Base/CoverViewBaseStyle.xaml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/CoverView.xaml b/HandyControl/Themes/Styles/CoverView.xaml new file mode 100644 index 00000000..825650eb --- /dev/null +++ b/HandyControl/Themes/Styles/CoverView.xaml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/Style.xaml b/HandyControl/Themes/Styles/Style.xaml index 19959398..a460151f 100644 --- a/HandyControl/Themes/Styles/Style.xaml +++ b/HandyControl/Themes/Styles/Style.xaml @@ -50,6 +50,7 @@ + \ No newline at end of file diff --git a/HandyControlDemo/Data/MessageToken.cs b/HandyControlDemo/Data/MessageToken.cs index 51a59bfe..927788fb 100644 --- a/HandyControlDemo/Data/MessageToken.cs +++ b/HandyControlDemo/Data/MessageToken.cs @@ -70,6 +70,8 @@ public static readonly string WaterfallPanelDemoCtl = nameof(WaterfallPanelDemoCtl); + public static readonly string CoverViewDemoCtl = nameof(CoverViewDemoCtl); + public static readonly string ButtonDemoCtl = nameof(ButtonDemoCtl); public static readonly string ToggleButtonDemoCtl = nameof(ToggleButtonDemoCtl); diff --git a/HandyControlDemo/Data/MessageToken.tt b/HandyControlDemo/Data/MessageToken.tt index 5ea16e51..ffe9e0de 100644 --- a/HandyControlDemo/Data/MessageToken.tt +++ b/HandyControlDemo/Data/MessageToken.tt @@ -37,7 +37,8 @@ var controlList = new List "BlurWindow", "RateDemoCtl", "ShieldDemoCtl", - "WaterfallPanelDemoCtl" + "WaterfallPanelDemoCtl", + "CoverViewDemoCtl" }; var styleList = new List { diff --git a/HandyControlDemo/HandyControlDemo.csproj b/HandyControlDemo/HandyControlDemo.csproj index 16ec2be7..21f1785f 100644 --- a/HandyControlDemo/HandyControlDemo.csproj +++ b/HandyControlDemo/HandyControlDemo.csproj @@ -139,6 +139,9 @@ CompareSliderDemoCtl.xaml + + CoverViewDemoCtl.xaml + DatePickerDemoCtl.xaml @@ -418,6 +421,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer @@ -678,6 +685,7 @@ TextTemplatingFileGenerator MessageToken.cs + diff --git a/HandyControlDemo/Properties/Langs/Lang.Designer.cs b/HandyControlDemo/Properties/Langs/Lang.Designer.cs index 643b06b1..6e2798e8 100644 --- a/HandyControlDemo/Properties/Langs/Lang.Designer.cs +++ b/HandyControlDemo/Properties/Langs/Lang.Designer.cs @@ -47,7 +47,7 @@ namespace HandyControlDemo.Properties.Langs { } /// - /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性 /// 重写当前线程的 CurrentUICulture 属性。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] @@ -303,6 +303,15 @@ namespace HandyControlDemo.Properties.Langs { } } + /// + /// 查找类似 封面视图 的本地化字符串。 + /// + public static string CoverView { + get { + return ResourceManager.GetString("CoverView", resourceCulture); + } + } + /// /// 查找类似 危险 的本地化字符串。 /// diff --git a/HandyControlDemo/Properties/Langs/Lang.en.resx b/HandyControlDemo/Properties/Langs/Lang.en.resx index faf3af75..a99298ea 100644 --- a/HandyControlDemo/Properties/Langs/Lang.en.resx +++ b/HandyControlDemo/Properties/Langs/Lang.en.resx @@ -456,4 +456,7 @@ Groups + + CoverView + \ No newline at end of file diff --git a/HandyControlDemo/Properties/Langs/Lang.resx b/HandyControlDemo/Properties/Langs/Lang.resx index 0bfff05e..ef6c99fb 100644 --- a/HandyControlDemo/Properties/Langs/Lang.resx +++ b/HandyControlDemo/Properties/Langs/Lang.resx @@ -436,4 +436,7 @@ 组数 + + 封面视图 + \ No newline at end of file diff --git a/HandyControlDemo/Resources/Img/LeftMainContent/DetailDataView_16x.png b/HandyControlDemo/Resources/Img/LeftMainContent/DetailDataView_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..64f2bcd000544d559cd1c4faaaa3c55f5d6d8ab1 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMprEm* zi(^Pd+}jBoIT;*yn2cxtKA${WJ)S*CC1G(wX~BYp{3q{x;bz#PYxZI9gS0055A2_8 Yta}3fe{JQQ4b;xy>FVdQ&MBb@09ZvRivR!s literal 0 HcmV?d00001 diff --git a/HandyControlDemo/UserControl/Controls/CoverViewDemoCtl.xaml b/HandyControlDemo/UserControl/Controls/CoverViewDemoCtl.xaml new file mode 100644 index 00000000..d2302a54 --- /dev/null +++ b/HandyControlDemo/UserControl/Controls/CoverViewDemoCtl.xaml @@ -0,0 +1,13 @@ + + + + +