From 459ec0639556f2df9a59e2c2f25fd191a6f98cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:45:23 +0800 Subject: [PATCH 01/39] Update BaseControl.cs --- .../Utilities/BaseControl.cs | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/src/WPFDevelopers.Shared/Utilities/BaseControl.cs b/src/WPFDevelopers.Shared/Utilities/BaseControl.cs index c92446f0..a96f310a 100644 --- a/src/WPFDevelopers.Shared/Utilities/BaseControl.cs +++ b/src/WPFDevelopers.Shared/Utilities/BaseControl.cs @@ -26,28 +26,5 @@ public object Child } public static readonly DependencyProperty ChildProperty = DependencyProperty.Register("Child", typeof(object), typeof(BaseControl), new PropertyMetadata(null)); - public static object GetIsAddChild(UIElement element) - { - if (element == null) { throw new ArgumentNullException("element"); } - - return (object)element.GetValue(IsAddChildProperty); - } - - public static void SetIsAddChild(UIElement element, object child) - { - if (element == null) { throw new ArgumentNullException("element"); } - - element.SetValue(IsAddChildProperty, child); - } - - public bool IsAddChild - { - get { return (bool)GetValue(IsAddChildProperty); } - set { SetValue(IsAddChildProperty, value); } - } - - public static readonly DependencyProperty IsAddChildProperty = - DependencyProperty.Register("IsAddChild", typeof(bool), typeof(BaseControl), new PropertyMetadata(false)); - } } From 9c0dd4907e0f53811f66f4b6a92c09c3d41f22e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:30 +0800 Subject: [PATCH 02/39] update Mask control --- src/WPFDevelopers.Shared/Controls/Mask/Mask.cs | 16 ++++++++++++++-- .../Controls/Mask/MaskControl.cs | 6 ++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/WPFDevelopers.Shared/Controls/Mask/Mask.cs b/src/WPFDevelopers.Shared/Controls/Mask/Mask.cs index 04922015..ee820295 100644 --- a/src/WPFDevelopers.Shared/Controls/Mask/Mask.cs +++ b/src/WPFDevelopers.Shared/Controls/Mask/Mask.cs @@ -13,10 +13,11 @@ public class Mask : BaseControl private static void OnIsShowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (e.NewValue is bool IsShow && d is FrameworkElement parent) + if (e.NewValue is bool isShow && d is FrameworkElement parent) { - if (IsShow) + if (isShow) { + parent.IsVisibleChanged += Parent_IsVisibleChanged; if (!parent.IsLoaded) parent.Loaded += Parent_Loaded; else @@ -25,11 +26,22 @@ private static void OnIsShowChanged(DependencyObject d, DependencyPropertyChange else { parent.Loaded -= Parent_Loaded; + parent.IsVisibleChanged -= Parent_IsVisibleChanged; CreateMask(parent, true); } } } + private static void Parent_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (e.NewValue is bool isVisible && sender is FrameworkElement parent) + { + var isShow = GetIsShow(parent); + if (isVisible && isShow && !parent.IsLoaded) + CreateMask(parent); + } + } + private static void Parent_Loaded(object sender, RoutedEventArgs e) { if (sender is UIElement element) diff --git a/src/WPFDevelopers.Shared/Controls/Mask/MaskControl.cs b/src/WPFDevelopers.Shared/Controls/Mask/MaskControl.cs index c417542c..19e4b339 100644 --- a/src/WPFDevelopers.Shared/Controls/Mask/MaskControl.cs +++ b/src/WPFDevelopers.Shared/Controls/Mask/MaskControl.cs @@ -12,6 +12,12 @@ public class MaskControl : ContentControl private readonly Visual visual; + static MaskControl() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(MaskControl), + new FrameworkPropertyMetadata(typeof(MaskControl))); + } + public MaskControl(Visual _visual) { visual = _visual; From a780bcddf61e2e17f00aa6d09e319f9f2cac16ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:38 +0800 Subject: [PATCH 03/39] Update ControlsHelper.cs --- .../Helpers/ControlsHelper.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/WPFDevelopers.Shared/Helpers/ControlsHelper.cs b/src/WPFDevelopers.Shared/Helpers/ControlsHelper.cs index 5b0c222f..b6e891e6 100644 --- a/src/WPFDevelopers.Shared/Helpers/ControlsHelper.cs +++ b/src/WPFDevelopers.Shared/Helpers/ControlsHelper.cs @@ -196,7 +196,6 @@ public static bool IsNumber(string text) public static BitmapSource Capture() { - IntPtr hBitmap; var hDC = Win32.GetDC(Win32.GetDesktopWindow()); var hMemDC = Win32.CreateCompatibleDC(hDC); @@ -219,7 +218,33 @@ public static BitmapSource Capture() } return null; } + public static AdornerLayer GetAdornerLayer(Visual visual) + { + var decorator = visual as AdornerDecorator; + if (decorator != null) + return decorator.AdornerLayer; + var presenter = visual as ScrollContentPresenter; + if (presenter != null) + return presenter.AdornerLayer; + var visualContent = (visual as Window)?.Content as Visual; + return AdornerLayer.GetAdornerLayer(visualContent ?? visual); + } + + public static Window GetDefaultWindow() + { + Window window = null; + if (Application.Current.Windows.Count > 0) + { + window = Application.Current.Windows.OfType().FirstOrDefault(o => o.IsActive); + if (window == null) + window = Enumerable.FirstOrDefault(Application.Current.Windows.OfType()); + } + return window; + } + } + + #region 是否设计时模式 public class DesignerHelper { From 038057dc25b90e0a56a503bc3c0175bd961b24d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:42 +0800 Subject: [PATCH 04/39] Update WindowHelpers.cs --- .../Helpers/WindowHelpers.cs | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/WPFDevelopers.Shared/Helpers/WindowHelpers.cs b/src/WPFDevelopers.Shared/Helpers/WindowHelpers.cs index bf1593de..29cf48fb 100644 --- a/src/WPFDevelopers.Shared/Helpers/WindowHelpers.cs +++ b/src/WPFDevelopers.Shared/Helpers/WindowHelpers.cs @@ -1,7 +1,4 @@ -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Documents; +using System.Windows; using System.Windows.Media; using WPFDevelopers.Controls; using WPFDevelopers.Utilities; @@ -22,10 +19,8 @@ public static void MaskShow(this Window outputWindow) } public static void CreateMask(this Window outputWindow) { - Visual parent = null; - if (Application.Current.Windows.Count > 0) - parent = Application.Current.Windows.OfType().FirstOrDefault(o => o.IsActive); - var _layer = GetAdornerLayer(parent); + Visual parent = ControlsHelper.GetDefaultWindow(); + var _layer = ControlsHelper.GetAdornerLayer(parent); if (_layer == null) return; var _adornerContainer = new AdornerContainer(_layer) { @@ -41,16 +36,5 @@ public static void CreateMask(this Window outputWindow) }; } } - static AdornerLayer GetAdornerLayer(Visual visual) - { - var decorator = visual as AdornerDecorator; - if (decorator != null) - return decorator.AdornerLayer; - var presenter = visual as ScrollContentPresenter; - if (presenter != null) - return presenter.AdornerLayer; - var visualContent = (visual as Window)?.Content as Visual; - return AdornerLayer.GetAdornerLayer(visualContent ?? visual); - } } } From 951e73ebde3b99da4538bd0fd7234b90f9ae80d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:47 +0800 Subject: [PATCH 05/39] Update Styles.CheckBox.xaml --- src/WPFDevelopers.Shared/Styles/Styles.CheckBox.xaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/WPFDevelopers.Shared/Styles/Styles.CheckBox.xaml b/src/WPFDevelopers.Shared/Styles/Styles.CheckBox.xaml index 4e92cee5..06a50fca 100644 --- a/src/WPFDevelopers.Shared/Styles/Styles.CheckBox.xaml +++ b/src/WPFDevelopers.Shared/Styles/Styles.CheckBox.xaml @@ -14,6 +14,9 @@ + + + @@ -27,8 +30,8 @@ x:Name="PART_Border" Width="16" Height="16" - Background="{DynamicResource WD.WindowForegroundColorBrush}" - BorderBrush="{DynamicResource WD.BaseSolidColorBrush}" + Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="3"> @@ -68,8 +71,7 @@ VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Focusable="False" RecognizesAccessKey="True" - SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" - TextElement.Foreground="{DynamicResource WD.PrimaryTextSolidColorBrush}" /> + SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> From 7097b8aa91021c2d95edc943350159ac78d8df05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:49 +0800 Subject: [PATCH 06/39] Update Styles.ComboBox.xaml --- src/WPFDevelopers.Shared/Styles/Styles.ComboBox.xaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/WPFDevelopers.Shared/Styles/Styles.ComboBox.xaml b/src/WPFDevelopers.Shared/Styles/Styles.ComboBox.xaml index 58aae9af..16c155df 100644 --- a/src/WPFDevelopers.Shared/Styles/Styles.ComboBox.xaml +++ b/src/WPFDevelopers.Shared/Styles/Styles.ComboBox.xaml @@ -100,6 +100,7 @@ + @@ -297,6 +298,7 @@ + @@ -318,7 +320,7 @@ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" - TextElement.Foreground="{DynamicResource WD.RegularTextSolidColorBrush}" /> + TextElement.Foreground="{TemplateBinding Foreground}" /> From 38659fb9832e68bc925d1b3b1d98feec3dde38e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:46:52 +0800 Subject: [PATCH 07/39] Update Styles.DataGrid.xaml --- .../Styles/Styles.DataGrid.xaml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/WPFDevelopers.Shared/Styles/Styles.DataGrid.xaml b/src/WPFDevelopers.Shared/Styles/Styles.DataGrid.xaml index e05d65da..c97d63a7 100644 --- a/src/WPFDevelopers.Shared/Styles/Styles.DataGrid.xaml +++ b/src/WPFDevelopers.Shared/Styles/Styles.DataGrid.xaml @@ -195,20 +195,6 @@ - - - - - - - - - - - - - - + \ No newline at end of file From fb652f710eaeffc1ad3d3dafd03c93ae2bc308d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:49:11 +0800 Subject: [PATCH 15/39] add in Message control --- .../Controls/Message/Message.cs | 44 +++++++++++ .../Controls/Message/MessageAdorner.cs | 73 +++++++++++++++++++ .../Controls/Message/MessageListBox.cs | 19 +++++ .../Controls/Message/MessageListBoxItem.cs | 27 +++++++ .../Controls/MessageBox/MessageBox.cs | 4 +- .../Helpers/ListBoxItemExtensions.cs | 61 ++++++++++++++++ 6 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 src/WPFDevelopers.Shared/Controls/Message/Message.cs create mode 100644 src/WPFDevelopers.Shared/Controls/Message/MessageAdorner.cs create mode 100644 src/WPFDevelopers.Shared/Controls/Message/MessageListBox.cs create mode 100644 src/WPFDevelopers.Shared/Controls/Message/MessageListBoxItem.cs create mode 100644 src/WPFDevelopers.Shared/Helpers/ListBoxItemExtensions.cs diff --git a/src/WPFDevelopers.Shared/Controls/Message/Message.cs b/src/WPFDevelopers.Shared/Controls/Message/Message.cs new file mode 100644 index 00000000..2cb96ef1 --- /dev/null +++ b/src/WPFDevelopers.Shared/Controls/Message/Message.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using System.Windows; +using WPFDevelopers.Helpers; + +namespace WPFDevelopers.Controls +{ + public static class Message + { + private static MessageAdorner messageAdorner; + + static void CreateMessageAdorner(Window owner = null, string message = null, MessageBoxImage type = MessageBoxImage.Information, bool center = false) + { + try + { + if (messageAdorner != null) + { + messageAdorner.Push(message, type, center); + return; + } + if (owner == null) + owner = ControlsHelper.GetDefaultWindow(); + var layer = ControlsHelper.GetAdornerLayer(owner); + if (layer == null) + throw new Exception("not AdornerLayer is null"); + messageAdorner = new MessageAdorner(layer); + layer.Add(messageAdorner); + messageAdorner.Push(message, type, center); + } + catch (Exception) + { + throw; + } + } + public static void Push(this Window owner, string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false) + { + CreateMessageAdorner(owner, message, type, center); + } + public static void Push(string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false) + { + CreateMessageAdorner(message: message, type: type, center: center); + } + } +} diff --git a/src/WPFDevelopers.Shared/Controls/Message/MessageAdorner.cs b/src/WPFDevelopers.Shared/Controls/Message/MessageAdorner.cs new file mode 100644 index 00000000..edcabb01 --- /dev/null +++ b/src/WPFDevelopers.Shared/Controls/Message/MessageAdorner.cs @@ -0,0 +1,73 @@ +using System.Windows; +using System.Windows.Documents; +using System.Windows.Media; + +namespace WPFDevelopers.Controls +{ + public class MessageAdorner : Adorner + { + private MessageListBox listBox; + private UIElement _child; + private FrameworkElement adornedElement; + public MessageAdorner(UIElement adornedElement) : base(adornedElement) + { + this.adornedElement = adornedElement as FrameworkElement; + } + + public void Push(string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false) + { + if (listBox == null) + { + listBox = new MessageListBox(); + Child = listBox; + } + var mItem = new MessageListBoxItem { Content = message, MessageType = type, IsCenter = center }; + listBox.Items.Insert(0, mItem); + } + + + + private void ListBox_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (e.NewSize.Height != 0.0) + return; + listBox.Items.RemoveAt(listBox.Items.Count - 1); + } + + public UIElement Child + { + get => _child; + set + { + if (value == null) + { + RemoveVisualChild(_child); + _child = value; + return; + } + AddVisualChild(value); + _child = value; + } + } + protected override int VisualChildrenCount + { + get + { + return _child != null ? 1 : 0; + } + } + + protected override Size ArrangeOverride(Size finalSize) + { + var x = (adornedElement.ActualWidth - _child.DesiredSize.Width) / 2; + _child.Arrange(new Rect(new Point(x, 0), _child.DesiredSize)); + return finalSize; + } + + protected override Visual GetVisualChild(int index) + { + if (index == 0 && _child != null) return _child; + return base.GetVisualChild(index); + } + } +} diff --git a/src/WPFDevelopers.Shared/Controls/Message/MessageListBox.cs b/src/WPFDevelopers.Shared/Controls/Message/MessageListBox.cs new file mode 100644 index 00000000..6b6f208c --- /dev/null +++ b/src/WPFDevelopers.Shared/Controls/Message/MessageListBox.cs @@ -0,0 +1,19 @@ +using System.Windows; +using System.Windows.Controls; + +namespace WPFDevelopers.Controls +{ + public class MessageListBox : ListBox + { + protected override bool IsItemItsOwnContainerOverride(object item) + { + return item is MessageListBoxItem; + } + + protected override DependencyObject GetContainerForItemOverride() + { + return new MessageListBoxItem(); + } + + } +} diff --git a/src/WPFDevelopers.Shared/Controls/Message/MessageListBoxItem.cs b/src/WPFDevelopers.Shared/Controls/Message/MessageListBoxItem.cs new file mode 100644 index 00000000..2f1f8ff6 --- /dev/null +++ b/src/WPFDevelopers.Shared/Controls/Message/MessageListBoxItem.cs @@ -0,0 +1,27 @@ +using System.Windows; +using System.Windows.Controls; + +namespace WPFDevelopers.Controls +{ + public class MessageListBoxItem : ListBoxItem + { + public MessageBoxImage MessageType + { + get { return (MessageBoxImage)GetValue(MessageTypeProperty); } + set { SetValue(MessageTypeProperty, value); } + } + public static readonly DependencyProperty MessageTypeProperty = + DependencyProperty.Register("MessageType", typeof(MessageBoxImage), typeof(MessageListBoxItem), new PropertyMetadata(MessageBoxImage.Information)); + + public bool IsCenter + { + get { return (bool)GetValue(IsCenterProperty); } + set { SetValue(IsCenterProperty, value); } + } + + public static readonly DependencyProperty IsCenterProperty = + DependencyProperty.Register("IsCenter", typeof(bool), typeof(MessageListBoxItem), new PropertyMetadata(false)); + + + } +} diff --git a/src/WPFDevelopers.Shared/Controls/MessageBox/MessageBox.cs b/src/WPFDevelopers.Shared/Controls/MessageBox/MessageBox.cs index c3da4790..1c2d3212 100644 --- a/src/WPFDevelopers.Shared/Controls/MessageBox/MessageBox.cs +++ b/src/WPFDevelopers.Shared/Controls/MessageBox/MessageBox.cs @@ -48,9 +48,7 @@ private static MessageBoxResult GetWindow(WPFMessageBox msg, Window owner = null } else { - Window win = null; - if (Application.Current.Windows.Count > 0) - win = Application.Current.Windows.OfType().FirstOrDefault(o => o.IsActive); + var win = ControlsHelper.GetDefaultWindow(); if (win != null) { if (win.WindowState == WindowState.Minimized) diff --git a/src/WPFDevelopers.Shared/Helpers/ListBoxItemExtensions.cs b/src/WPFDevelopers.Shared/Helpers/ListBoxItemExtensions.cs new file mode 100644 index 00000000..868000d9 --- /dev/null +++ b/src/WPFDevelopers.Shared/Helpers/ListBoxItemExtensions.cs @@ -0,0 +1,61 @@ +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; + +namespace WPFDevelopers.Helpers +{ + public static class ListBoxItemExtensions + { + public static readonly DependencyProperty AutoRemoveOnOpacityZeroProperty = + DependencyProperty.RegisterAttached("AutoRemoveOnOpacityZero", typeof(bool), typeof(ListBoxItemExtensions), new PropertyMetadata(false, OnAutoRemoveOnOpacityZeroChanged)); + + public static bool GetAutoRemoveOnOpacityZero(DependencyObject obj) + { + return (bool)obj.GetValue(AutoRemoveOnOpacityZeroProperty); + } + + public static void SetAutoRemoveOnOpacityZero(DependencyObject obj, bool value) + { + obj.SetValue(AutoRemoveOnOpacityZeroProperty, value); + } + + private static void OnAutoRemoveOnOpacityZeroChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) + { + ListBoxItem item = obj as ListBoxItem; + if (item != null) + { + if ((bool)e.NewValue) + item.Loaded += Item_Loaded; + else + item.Loaded -= Item_Loaded; + } + } + + private static void Item_Loaded(object sender, RoutedEventArgs e) + { + var item = sender as ListBoxItem; + if (item != null) + { + var binding = new Binding("Opacity"); + binding.Source = item; + binding.Mode = BindingMode.OneWay; + + var dpd = DependencyPropertyDescriptor.FromProperty(UIElement.OpacityProperty, typeof(UIElement)); + dpd.AddValueChanged(item, (s, args) => + { + if (item.Opacity < 0.1) + { + var parent = ItemsControl.ItemsControlFromItemContainer(item); + if (parent != null) + { + object selectedItem = parent.ItemContainerGenerator.ItemFromContainer(item); + parent.Items.Remove(selectedItem); + parent.Items.Refresh(); + } + } + }); + } + } + } +} From 1688de34f1b8b9d75d6acae8952d5e35dec61e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E9=A9=9A=E9=8F=B5?= Date: Sun, 9 Jul 2023 22:49:17 +0800 Subject: [PATCH 16/39] Create Message.xaml --- src/WPFDevelopers.Shared/Themes/Message.xaml | 178 +++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 src/WPFDevelopers.Shared/Themes/Message.xaml diff --git a/src/WPFDevelopers.Shared/Themes/Message.xaml b/src/WPFDevelopers.Shared/Themes/Message.xaml new file mode 100644 index 00000000..3e9b56f8 --- /dev/null +++ b/src/WPFDevelopers.Shared/Themes/Message.xaml @@ -0,0 +1,178 @@ + + + + + + + + + @@ -636,7 +652,7 @@ + @@ -636,7 +652,7 @@ +