首页 > 其他分享 >mvvmtoolkit+snackbar弹窗消息通知

mvvmtoolkit+snackbar弹窗消息通知

时间:2024-02-28 19:24:55浏览次数:33  
标签:mvvmtoolkit snackbar get private 消息 public 弹窗 GlobalMessage

需求场景:
在MainView.xaml下添加一个SnackBar并将其ZIndex设置成1,后续所有的消息弹窗都通过MainView来展示

代码设置:

MVVMToolkit+MaterDesigner组+全局静态类

MainView下添加SnackBar,SnackBar下的消息数据以及是否展示属性绑定至一个全局消息类中,后续所有的消息展示则可以通过全局消息静态类中的方法以及属性来进行

View下的静态属性绑定如下

IsActive="{Binding Path=MessageActive, Source={x:Static         local:GlobalMessage.Instance}}"
MessageQueue="{Binding Path=MessageQueue, Source={x:Static local:GlobalMessage.Instance}}" 

ViewModel下使用消息如下

GlobalMessage.Instance.ShowMessageDialog("XXXX");

完整代码为
XAML前端代码如下

<Window
    x:Class="SnackbarTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:SnackbarTest"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <materialDesign:Snackbar
         Margin="10"
         VerticalAlignment="Top"
         Panel.ZIndex="1"
         IsActive="{Binding Path=MessageActive, Source={x:Static         local:GlobalMessage.Instance}}"
         MessageQueue="{Binding Path=MessageQueue, Source={x:Static local:GlobalMessage.Instance}}" />
        <StackPanel>
            <TextBox Margin="10"  Text="{Binding Mess}" />
            <Button
             Margin="10"
             HorizontalAlignment="Center"
             VerticalAlignment="Center"
             Command="{Binding ShowCommand}"
             Content="消息展示" />
        </StackPanel>
    </Grid>
</Window>

ViewModel如下

public class MainViewModel : ObservableRecipient
{
private string _mess = "";

    public string Mess
    {
         get => _mess;
         set => SetProperty(ref _mess, value);
    }

    public RelayCommand ShowCommand { get; }

    public MainViewModel()
    {
         ShowCommand = new RelayCommand(Show);
    }

    public void Show()
    {
        GlobalMessage.Instance.ShowMessageDialog(Mess);
    }
}

全局消息静态类如下

/// <summary>
/// 全局静态单例消息类,用于全局显示静态消息,属性绑定至MainWindow下
/// </summary>
public class GlobalMessage : ObservableRecipient
{
    private GlobalMessage()
    { }

    public static GlobalMessage Instance { private set; get; } = new GlobalMessage();

    //是否弹窗显示消息
    private bool _messageActive = false;

    public bool MessageActive
    {
         get => _messageActive;
         set => SetProperty(ref _messageActive, value);
    }

    //消息显示框数据
    private SnackbarMessageQueue _messageQueue = new SnackbarMessageQueue();

    public SnackbarMessageQueue MessageQueue
    {
         get => _messageQueue;
         set => SetProperty(ref _messageQueue, value);
    }

    /// <summary>
    /// 显示弹窗提示消息
    /// </summary>
    /// <param name="message"></param>
    public void ShowMessageDialog(string message)
    {
        //延时1秒后消息消失
         MessageActive = true;
        MessageQueue.Enqueue(message, null, null, null, false, false, TimeSpan.FromSeconds(1));
    }
}

显示效果为:

标签:mvvmtoolkit,snackbar,get,private,消息,public,弹窗,GlobalMessage
From: https://www.cnblogs.com/SmallCarp/p/18041492

相关文章

  • 弹窗组件一般需要使用memo记忆化吗
    弹窗组件(Modal)是否需要使用记忆化(memoization),主要取决于该组件的性能优化需求以及其内部复杂性。记忆化是一种用于优化函数或组件性能的技术,它通过缓存先前计算的结果以避免在相同的输入参数下重复执行耗时的操作。对于一个简单的弹窗组件而言,如果其内容不涉及复杂的计算或者大量......
  • APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务
    一、概述华为APP应用市场反馈问题:(目前是华为审核特有的问题)APP在申请敏感权限时,应同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途;告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等验证了小米、vivo、oppo、应用宝,只......
  • 点击修改某一行数据,打开弹窗,是从点击行上带出修改对象的数据进行回显,还是根据id从后端
    在前端开发中,点击修改某一行数据并打开弹窗进行回显时,常见的做法有两种:从点击行上带出修改对象的数据进行回显:如果列表渲染时,每一行的数据对象已经完整地加载到前端(例如通过一次性获取所有列表数据或者分页加载时将当前页面数据加载至前端),那么可以直接根据用户点击的行数据更......
  • 安卓手机日程不响铃或弹窗提醒怎么设置?
    在庞大的安卓手机用户群体中,诸多手机品牌如小米、OPPO、vivo、荣耀等都为用户提供了丰富的功能和便捷的体验。然而,有时候我们在手机日历中设置了提醒时间,却发现安卓手机的日程提醒并没有如期响铃或弹窗,这着实令人头疼。那么安卓手机日程不响铃或弹窗提醒怎么设置?当遇到安卓手机日......
  • JavaScript 实现浏览器级别的弹窗提示
    可放在网页任何位置,以下是代码:1.每次打开都会弹出提示<script>//在页面加载时触发警告框window.onload=function(){alert('这是浏览器级别的弹窗提示!');};</script> 2.打开只弹出一次,刷新网页不会弹出,清理浏览器缓存会再次弹出<script>/......
  • jq点击弹窗出现对应的内容图片标题
    html                 <divclass="swiper-slidestore_itemstore_bgborder20tab_btn"                  data-img="static/demo/chuneng/cngypro2.png"data-title="20尺液冷集装箱(单/双开门)">......
  • 【.NET 5.0】WPF使用弹窗选择文件和文件夹
    一开始使用下面方法调起文件夹窗,始终提示System.Windows.Forms这个命名空间无法引入.//选择文件夹System.Windows.Forms.FolderBrowserDialogFolderBrowserDialog=newSystem.Windows.Forms.FolderBrowserDialog();if(FolderBrowserDialog.ShowDialog()==System.Win......
  • python pyqt6 颜色弹窗 QColorDialog
     defsetColor(self):#避免窗口置顶后,Dialog被主窗口覆盖,所以需要传递self#设定默认颜色使用getColor的第一个参数(使用setCurrentColor不生效)#"选择颜色"为Dialog弹窗的标题#设定QColorDialog.ColorDialogOption.ShowAlphaChanne......
  • 2024-01-13 antd的tabel组件业务问题之勾选了table中的一项,然后弹出弹窗,接着关闭弹窗,
    如图:问题:table显示的勾选状态的数据无法被改变。原因:你没有改变到勾选数据,你只是在勾选时把选中的值赋值给了一个变量,然后以为自己清空了变量,以为自然而然地就取消勾选状态了,实际上就是你代码没写全!解决方案:原来写法:rowSelection:{onChange:handleChange,},你写......
  • 5分钟搞定vue3函数式弹窗
    前言最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面。如果每个页面都去手动导入弹窗组件,在点击按钮后弹出弹窗。再拿到弹窗返回的账号密码后去请求接口也太累了,那么有没有更简单的实现方式呢?函数式弹窗的使用场景......