用WPF自定义控件实现消息提示
创建消息提示控件
1,消息提示控件
internal class Message : ContentControl{public int Time { get; set; }[Bindable(true)]public MessageType MessageType { get { return (MessageType)GetValue(MessageTypeProperty); } set { SetValue(MessageTypeProperty, value); } }public static readonly DependencyProperty MessageTypeProperty = DependencyProperty.Register("MessageType", typeof(MessageType), typeof(Message), new PropertyMetadata(default(MessageType)));internal Message(){Loaded += Message_Loaded;}private async void Message_Loaded(object sender, System.Windows.RoutedEventArgs e){if (Parent is MessageHost host){await Task.Delay(Time);host.Items.Remove(this);}}}
2,消息提示控件样式
3,消息类型枚举
public enum MessageType{[Description("默认")]Default,[Description("成功")]Success,[Description("警告")]Warning,[Description("错误")]Error}
创建消息提示控件容器
1,消息提示控件容器
public class MessageHost : System.Windows.Controls.ItemsControl{public string Token { get { return (string)GetValue(TokenProperty); } set { SetValue(TokenProperty, value); } }public static readonly DependencyProperty TokenProperty = DependencyProperty.Register("Token", typeof(string), typeof(MessageHost), new PropertyMetadata(OnTokenChanged));private static void OnTokenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){if(d is MessageHost host){var token = e.NewValue.ToString();if (MessageHosts.ContainsKey(token)){MessageHosts.Remove(token);}MessageHosts.Add(token, host);}}protected override bool IsItemItsOwnContainerOverride(object item){return item is Message;}protected override DependencyObject GetContainerForItemOverride(){return new Message();}}
2,消息提示控件容器样式
创建消息通知类
消息通知
public class MessageManage{internal static Dictionary MessageHosts { get; set; } = MessageHosts ?? new Dictionary();public static void Default(string message, string token, int time = 3000){Show(message, MessageType.Default, token, time);}public static void Success(string message, string token, int time = 3000){Show(message, MessageType.Success, token, time);}public static void Warning(string message, string token, int time = 3000){Show(message, MessageType.Warning, token, time);}public static void Error(string message, string token, int time = 3000){Show(message, MessageType.Error, token, time);}private static void Show(string message, MessageType messageType, string token, double time){if (!MessageHosts.ContainsKey(token)) return;var messageHost = MessageHosts[token];messageHost.Dispatcher.BeginInvoke( (Action)(() =>{messageHost.Items.Add(new Message() { MessageType = messageType, Content = message, Time = time, Uid = Guid.NewGuid().ToString() });}));}}
使用示例:
在app.xaml中引入资源
MainWindow.xaml
public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){MessageManage.Success("点击了测试", "MainmessageToken"); } }
效果:

通俗点讲就是在想要拥有提示的页面添加一个容器,容器中塞入消息提示控件,消息提示控件在指定时间之后从容器中移除;
MessageManage类通过token进行查找到指定容器进行塞入;
也可以全局使用一个消息容器进行提示;根据需求进行改造。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
