ToB企服应用市场:ToB评测及商务社交产业平台

标题: WPF 实现 Message 消息提醒控件 [打印本页]

作者: 灌篮少年    时间: 2023-7-14 22:45
标题: WPF 实现 Message 消息提醒控件
WPF 实现 Message 消息提醒控件
控   件:Message
作   者:WPFDevelopersOrg - 驚鏵
原文链接https://github.com/WPFDevelopersOrg/WPFDevelopers


1)新增 MessageListBoxItem.cs 代码如下:
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. namespace WPFDevelopers.Controls
  4. {
  5.     public class MessageListBoxItem : ListBoxItem
  6.     {
  7.         public MessageBoxImage MessageType
  8.         {
  9.             get { return (MessageBoxImage)GetValue(MessageTypeProperty); }
  10.             set { SetValue(MessageTypeProperty, value); }
  11.         }
  12.         public static readonly DependencyProperty MessageTypeProperty =
  13.             DependencyProperty.Register("MessageType", typeof(MessageBoxImage), typeof(MessageListBoxItem), new PropertyMetadata(MessageBoxImage.Information));
  14.         public bool IsCenter
  15.         {
  16.             get { return (bool)GetValue(IsCenterProperty); }
  17.             set { SetValue(IsCenterProperty, value); }
  18.         }
  19.         public static readonly DependencyProperty IsCenterProperty =
  20.             DependencyProperty.Register("IsCenter", typeof(bool), typeof(MessageListBoxItem), new PropertyMetadata(false));
  21.     }
  22. }
复制代码
2)新增 MessageListBox.cs 代码如下:
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. namespace WPFDevelopers.Controls
  4. {
  5.     public class MessageListBox : ListBox
  6.     {
  7.         protected override bool IsItemItsOwnContainerOverride(object item)
  8.         {
  9.             return item is MessageListBoxItem;
  10.         }
  11.         protected override DependencyObject GetContainerForItemOverride()
  12.         {
  13.             return new MessageListBoxItem();
  14.         }
  15.     }
  16. }
复制代码
3)新增 MessageAdorner.cs 代码如下:
  1. using System.Windows;
  2. using System.Windows.Documents;
  3. using System.Windows.Media;
  4. namespace WPFDevelopers.Controls
  5. {
  6.     public class MessageAdorner : Adorner
  7.     {
  8.         private MessageListBox listBox;
  9.         private UIElement _child;
  10.         private FrameworkElement adornedElement;
  11.         public MessageAdorner(UIElement adornedElement) : base(adornedElement)
  12.         {
  13.             this.adornedElement = adornedElement as FrameworkElement;
  14.         }
  15.         public void Push(string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false)
  16.         {
  17.             if (listBox == null)
  18.             {
  19.                 listBox = new MessageListBox();
  20.                 Child = listBox;
  21.             }
  22.             var mItem = new MessageListBoxItem { Content = message, MessageType = type, IsCenter = center };
  23.             listBox.Items.Insert(0, mItem);
  24.         }
  25.         public UIElement Child
  26.         {
  27.             get => _child;
  28.             set
  29.             {
  30.                 if (value == null)
  31.                 {
  32.                     RemoveVisualChild(_child);
  33.                     _child = value;
  34.                     return;
  35.                 }
  36.                 AddVisualChild(value);
  37.                 _child = value;
  38.             }
  39.         }
  40.         protected override int VisualChildrenCount
  41.         {
  42.             get
  43.             {
  44.                 return _child != null ? 1 : 0;
  45.             }
  46.         }
  47.         protected override Size ArrangeOverride(Size finalSize)
  48.         {
  49.             var x = (adornedElement.ActualWidth - _child.DesiredSize.Width) / 2;
  50.             _child.Arrange(new Rect(new Point(x, 0), _child.DesiredSize));
  51.             return finalSize;
  52.         }
  53.         protected override Visual GetVisualChild(int index)
  54.         {
  55.             if (index == 0 && _child != null) return _child;
  56.             return base.GetVisualChild(index);
  57.         }
  58.     }
  59. }
复制代码
4)新增 Message.cs 代码如下:
  1. using System;
  2. using System.Linq;
  3. using System.Windows;
  4. using WPFDevelopers.Helpers;
  5. namespace WPFDevelopers.Controls
  6. {
  7.     public static class Message
  8.     {
  9.         private static MessageAdorner messageAdorner;
  10.         static void CreateMessageAdorner(Window owner = null, string message = null, MessageBoxImage type = MessageBoxImage.Information, bool center = false)
  11.         {
  12.             try
  13.             {
  14.                 if (messageAdorner != null)
  15.                 {
  16.                     messageAdorner.Push(message, type, center);
  17.                     return;
  18.                 }
  19.                 if (owner == null)
  20.                     owner = ControlsHelper.GetDefaultWindow();
  21.                 var layer = ControlsHelper.GetAdornerLayer(owner);
  22.                 if (layer == null)
  23.                     throw new Exception("not AdornerLayer is null");
  24.                 messageAdorner = new MessageAdorner(layer);
  25.                 layer.Add(messageAdorner);
  26.                 messageAdorner.Push(message, type, center);
  27.             }
  28.             catch (Exception)
  29.             {
  30.                 throw;
  31.             }
  32.         }
  33.         public static void Push(this Window owner, string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false)
  34.         {
  35.             CreateMessageAdorner(owner, message, type, center);
  36.         }
  37.         public static void Push(string message, MessageBoxImage type = MessageBoxImage.Information, bool center = false)
  38.         {
  39.             CreateMessageAdorner(message: message, type: type, center: center);
  40.         }
  41.     }
  42. }
复制代码
5)新增 MessageListBoxItem.xaml 代码如下:
  1. <ResourceDictionary
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     xmlns:controls="clr-namespace:WPFDevelopers.Controls"
  5.     xmlns:helpers="clr-namespace:WPFDevelopers.Helpers">
  6.     <ResourceDictionary.MergedDictionaries>
  7.         <ResourceDictionary Source="Basic/ControlBasic.xaml" />
  8.     </ResourceDictionary.MergedDictionaries>
  9.    
  10.    
  11.     <Style BasedOn="{StaticResource WD.MessageListBoxItem}" TargetType="{x:Type controls:MessageListBoxItem}" />
  12.     <Style BasedOn="{StaticResource WD.MessageListBox}" TargetType="{x:Type controls:MessageListBox}" />
  13. </ResourceDictionary>
复制代码
6)新增 ListBoxItemExtensions 代码如下:
  1. using System.ComponentModel;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Data;
  5. namespace WPFDevelopers.Helpers
  6. {
  7.     public static class ListBoxItemExtensions
  8.     {
  9.         public static readonly DependencyProperty AutoRemoveOnOpacityZeroProperty =
  10.         DependencyProperty.RegisterAttached("AutoRemoveOnOpacityZero", typeof(bool), typeof(ListBoxItemExtensions), new PropertyMetadata(false, OnAutoRemoveOnOpacityZeroChanged));
  11.         public static bool GetAutoRemoveOnOpacityZero(DependencyObject obj)
  12.         {
  13.             return (bool)obj.GetValue(AutoRemoveOnOpacityZeroProperty);
  14.         }
  15.         public static void SetAutoRemoveOnOpacityZero(DependencyObject obj, bool value)
  16.         {
  17.             obj.SetValue(AutoRemoveOnOpacityZeroProperty, value);
  18.         }
  19.         private static void OnAutoRemoveOnOpacityZeroChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
  20.         {
  21.             ListBoxItem item = obj as ListBoxItem;
  22.             if (item != null)
  23.             {
  24.                 if ((bool)e.NewValue)
  25.                     item.Loaded += Item_Loaded;
  26.                 else
  27.                     item.Loaded -= Item_Loaded;
  28.             }
  29.         }
  30.         private static void Item_Loaded(object sender, RoutedEventArgs e)
  31.         {
  32.             var item = sender as ListBoxItem;
  33.             if (item != null)
  34.             {
  35.                 var binding = new Binding("Opacity");
  36.                 binding.Source = item;
  37.                 binding.Mode = BindingMode.OneWay;
  38.                 var dpd = DependencyPropertyDescriptor.FromProperty(UIElement.OpacityProperty, typeof(UIElement));
  39.                 dpd.AddValueChanged(item, (s, args) =>
  40.                 {
  41.                     if (item.Opacity < 0.1)
  42.                     {
  43.                         var parent = ItemsControl.ItemsControlFromItemContainer(item);
  44.                         if (parent != null)
  45.                         {
  46.                             object selectedItem = parent.ItemContainerGenerator.ItemFromContainer(item);
  47.                             parent.Items.Remove(selectedItem);
  48.                             parent.Items.Refresh();
  49.                         }
  50.                     }
  51.                 });
  52.             }
  53.         }
  54.     }
  55. }
复制代码
7)新增 示例 代码如下:
  1. <ResourceDictionary
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     xmlns:controls="clr-namespace:WPFDevelopers.Controls"
  5.     xmlns:helpers="clr-namespace:WPFDevelopers.Helpers">
  6.     <ResourceDictionary.MergedDictionaries>
  7.         <ResourceDictionary Source="Basic/ControlBasic.xaml" />
  8.     </ResourceDictionary.MergedDictionaries>
  9.    
  10.    
  11.     <Style BasedOn="{StaticResource WD.MessageListBoxItem}" TargetType="{x:Type controls:MessageListBoxItem}" />
  12.     <Style BasedOn="{StaticResource WD.MessageListBox}" TargetType="{x:Type controls:MessageListBox}" />
  13. </ResourceDictionary> <ResourceDictionary
  14.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  15.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  16.     xmlns:controls="clr-namespace:WPFDevelopers.Controls"
  17.     xmlns:helpers="clr-namespace:WPFDevelopers.Helpers">
  18.     <ResourceDictionary.MergedDictionaries>
  19.         <ResourceDictionary Source="Basic/ControlBasic.xaml" />
  20.     </ResourceDictionary.MergedDictionaries>
  21.    
  22.    
  23.     <Style BasedOn="{StaticResource WD.MessageListBoxItem}" TargetType="{x:Type controls:MessageListBoxItem}" />
  24.     <Style BasedOn="{StaticResource WD.MessageListBox}" TargetType="{x:Type controls:MessageListBox}" />
  25. </ResourceDictionary>                  
复制代码
8) 示例 代码如下:
  1. private void AddButton_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             var btn = sender as Button;
  4.             switch (btn.Tag)
  5.             {
  6.                 case "Info":
  7.                     Message.Push(App.Current.MainWindow, "This is a info message", MessageBoxImage.Information);
  8.                     break;
  9.                 case "Error":
  10.                     Message.Push("This is a error message", MessageBoxImage.Error, true);
  11.                     break;
  12.                 case "Warning":
  13.                     Message.Push("This is a warning message", MessageBoxImage.Warning, true);
  14.                     break;
  15.                 case "Question":
  16.                     Message.Push("This is a question message", MessageBoxImage.Question);
  17.                     break;
  18.                 default:
  19.                     Message.Push("这是一条很长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长消息", MessageBoxImage.Information);
  20.                     break;
  21.             }
  22.         }
复制代码

码云

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4