使用带 MVVM 指示灯的“X”按钮关闭窗口时进行确认

2023-12-06

我正在使用 WPF 和 MVVM Light 框架(我是新使用它们的)。

我想做以下事情:

  1. 当用户单击“X”关闭按钮时,我想显示一个确认窗口,以确定他是否要退出应用程序。
  2. 如果是,则应用程序关闭
  3. 如果否,则不会发生任何事情,他仍然可以正常使用该应用程序

到目前为止,我有这个:

  • 在 MainWindow.xaml.cs 中:

    public MainWindow()
    {
        InitializeComponent();
        Closing += (s, e) => ViewModelLocator.Cleanup();
    }
    
  • 在 ViewModelLocator.cs 中:

    public static void Cleanup()
    {
        ServiceLocator.Current.GetInstance<MainViewModel>().Cleanup();
    }
    
  • 在 MainViewModel.cs 中:

    public override void Cleanup()
    {
        MessageBoxResult result = MessageBox.Show(
                        "Unsaved data will be lost, would you like to exit?",
                        "Confirmation",
                        MessageBoxButton.YesNo,
                        MessageBoxImage.Question);
    
        if (result == MessageBoxResult.Yes)
        {
          // clean-up resources and exit
        }
        else
        {
          // ????
        }
    

实际上,如果用户回答“是”或“否”,在这两种情况下应用程序都会退出。

我不太确定如何从这里继续......

任何帮助都会很棒!

Thanks


您可以使用EventToCommand in an EventTrigger捕捉结束事件并设置Cancel过去的财产CancelEventArgs如果您想取消关闭,则为 true:

XAML:

<Window ...
   xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
   xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"
   DataContext="{Binding Main, Source={StaticResource Locator}}">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="Closing">
         <cmd:EventToCommand Command="{Binding OnClosingCommand}" 
            PassEventArgsToCommand="True"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
   <Grid>
     ...
   </Grid>
</Window>

视图模型:

public class MainViewModel : ViewModelBase
{
   public RelayCommand<CancelEventArgs> OnClosingCommand { get; set; }

   public MainViewModel()
   {
      this.OnClosingCommand = 
         new RelayCommand<CancelEventArgs>(this.OnClosingCommandExecuted);
   }

   private void OnClosingCommandExecuted(CancelEventArgs cancelEventArgs)
   {
      ...

      if (mustCancelClosing)
      {
         cancelEventArgs.Cancel = true;
      } 
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用带 MVVM 指示灯的“X”按钮关闭窗口时进行确认 的相关文章

  • 如何禁用箭头键更改焦点

    我有一个 WPF 窗口 其中有一些控件 按钮 组框等 和一个大控件Viewport3D在一个Border 视口显示 3D 场景 我希望使用箭头键来移动其相机 问题 方向键总是将焦点改变到另一个UIElement 如何通过箭头键禁用焦点更改并
  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • 如何使用 MVVM 更改数据网格或列表视图中的内容

    我有一个 MainWindowViewModel DataContext 它公开不同的 ObservableCollections 带有 INotifyProperty 的 poco 对象的视图模型 从组合框中选择一个值后 我想单击一个加载
  • 底部垂直滚动richtextbox [WPF]

    我有一个富文本框 当满了时我想自动滚动到底部 这可能吗 用xaml做这个吗 通过使用ScrollViewer ScrollChanged http msdn microsoft com en us library system window
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 为什么我的窗口没有被垃圾收集?

    我有一个标准的 CRUD 应用程序 可以处理相当大量的数据 不同的窗口使用 Linq To SQL 访问不同的表 每个窗口本质上都有一个网格 其中的单元格绑定到我正在显示的对象 这是正在发生的事情的一个非常标准的用例 打开窗口A 关闭窗口
  • 如何在运行时动态更改 DataGrid String 列格式?

    我的 WPF 桌面应用程序提供了一个 UI 来搜索人员并在 DataGrid 中显示结果 此外 用户可以在运行时更改语言 Current UI Culture XAML 中的 DataGrid 定义是
  • WPF 中的 stackpanel 和 virtualizingstackpanel 有什么区别?

    WPF 中的 stackpanel 和 virtualizingstackpanel 有什么区别 VirtualizingStack面板can在处理非常大的集合时提供性能优势 它通过仅渲染和处理用户可见的数据子集而不是处理整个数据列表来实现
  • Wpf DataGrid通过DataBinding隐藏完整行

    是否有可能通过数据绑定隐藏 DataGrid 行 如果我有一个具有可见性属性的 BO 或 ViewModel 项目 是否可以声明一个绑定 以便在该属性设置为不可见时该行将被隐藏 反之亦然 应该可以通过RowStyle 像这样的东西
  • 在多个页面上打印流程文档滚动查看器

    我正在尝试打印我的 FlowDocument 它被包装到 FlowDocumentScrollViewer 中 因为我有很多文本 文本框 组合框 并且页面高度可能会变高 我正在使用这个 PrintDialog printDialog new
  • 将 SQL 数据库附加到 ComboBox.ItemSsource (WPF)

    我想知道如何将 SQL Server 数据库分配给 ComboBox 的 ItemSource 属性 在 WPF 应用程序中 我将数据源分配给项目 但不知道如何分配给属性 此致 你可以这样尝试 你可以像下面这样绑定组合框的项目源属性 Ite
  • 我可以将 XAML/WPF 窗口复制到第二个窗口中,例如画中画电视吗?

    我有一个带有两个 XAML WPF 窗口 派生自 NavigationWindow 的应用程序 每个窗口都包含一个父 UserControl 其中放置了所有子控件 在其中一个窗口中 我想以画中画电视的方式显示第二个窗口的内容 实际上只是父
  • C# WPF 中的内存泄漏

    在处理所有使用过的对象后 我需要减少 c WPF 中的内存泄漏 但我无法通过使用以下代码片段完全减少内存消耗 这是我的代码 string str Uri uri private void Button Click object sender
  • 多个组合框绑定到一个公共源,强制执行不同的选择

    我正在尝试将多个 ComboBox 绑定到一个公共源集合 并强制执行一旦进行 ComboBox 选择 该所选项目就有可能从其他 ComboBox 中删除 该集合是动态构建的 因此我是用代码来完成的 到目前为止 我已经尝试以多种方式实现这一点
  • WPF 每次打开和关闭窗口时都会增加内存

    我已经做了非常简单的测试 只是为了了解 wpf 如何与内存一起工作 我用一个窗口创建一个项目 其中有一个Button 第二个窗口完全是空的 当我按下Button单击打开第二个窗口 窗口 1 后面的代码
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 一个好的 WPF 滚动时间线控件? (精美的日期时间选择器)

    我正在寻找可以用作时间线控件的东西 一种 横幅 用户可以向左或向右拖动以前进或后退 然后他或她应该能够在该控件上选择一个时间点 一个精美的日期时间选择器 有任何想法吗 欢迎您尝试我的新 TimelineControl 我已经在 codepl
  • 如何给RibbonComboBox数据绑定?

    我正在使用 wpf 4 和 Microsoft Ribbon 我的绑定显示 用户 列表中每个用户的名称 但下拉菜单关闭后 选择的内容未显示在 RibbonComboBox 中 Thanks 这对我有用 XAML
  • 在资源字典wpf中共享数据模板的一部分

    我有一个 ResourceDictionary 列出了我的 wpf 应用程序中使用的不同样式
  • 绑定到非 UIElement

    我在绑定方面遇到问题 自从RelativeSource需要视觉树向上移动并找到所需的祖先 您只能在UIElement但我正在尝试做一个RelativeSource绑定到非 UIElement 例如 ValidationRule 众所周知 它

随机推荐

  • 根据数组元素的属性获取数组元素的索引

    我有一个 JavaScript 对象数组 如下所示 var myArray 每个物体都有独特的id除其他属性外 id 4 property1 something property2 something 如果我只知道它 如何获取该数组中特定对
  • 未捕获的ReferenceError:进程未定义react-bootstrap

    我正在尝试将 React bootstrap js 文件包含到我的项目中几个小时 我是反应新手 我只会将它用于客户端 我尝试从 CDN 包含 但无法正常工作 React Bootstrap Uncaught ReferenceError 未
  • 是否可以从 Azure Python SDK 获取 ASC 位置?

    我正在使用以下方法获取订阅的安全分数Microsoft Azure 安全中心 ASC 管理客户端库 库中的所有操作都表明 您不应该直接实例化此类 而应创建一个 Client 实例 该实例将为您创建该类并将其附加为属性 因此 我正在创建一个安
  • 使用带有 unicode 字符的 ng-pattern (Angular.JS) 会产生不良结果

    我正在使用 ng pattern 其输入字段应仅接受希伯来字符 我已经找出了希伯来字符的 unicode 数字 这是我的模式 scope onlyHebrewPattern u05D0 u05F3 g 我的表单输入
  • Html5 Canvas 变换算法 - 应用变换后查找对象坐标

    在 html5 画布上 我正在绘制对象 矩形 圆形等 这些对象具有缩放 倾斜 旋转等变换属性 这些对象可以嵌套 当我应用转换后 我想找到给定对象的精确 x y 坐标时 就会出现问题 但它超出了我的范围 致所有热衷于交互式计算机图形学的专家
  • 在 Visual Studio 代码扩展中捕获击键

    我希望能够在 Visual Studio 代码扩展中捕获击键 我需要知道添加或删除的新文本以及文件中更改的位置 我已经注册了一个监听器 vscode window onDidChangeTextEditorSelection handleC
  • 如何检查派生类的类型? (C++ 实例)

    假设我有一些基本抽象类和三个派生并实现其方法的不同类 是否有像 C 中那样的 类型 对象 或者换句话说 我如何获取所有这些类的实例 ModuleBase cpp class ModuleBase Module1 cpp class Modu
  • ggplot:根据条形图中的名称更改堆叠条形的顺序

    ggplot data aes x ab y Freq total fill Result geom bar stat identity theme strip text x element text size 8 angle 0 stri
  • 如何使用 rsa 从 PEM 文件解密

    我使用以下 C 代码使用 rsa 和 PEM 文件进行加密和解密 public string encrypt string elementToEncrypt string pathPrivateKey string pem System I
  • 淡化标签文本的结尾

    我有一个UILabel 我想淡化字符串的末尾 这将超出范围 对此有什么更好的解决方案 我应该计算标签的宽度 将其与字符串宽度进行比较 如果字符串宽度大于标签的宽度 我应该淡出最后两个字母吗 我到底应该怎么做 我希望这会很容易 请写出你的解决
  • 如何绘制一个只是圆形的自定义 UIView - iPhone 应用程序

    我将如何绘制一个实际上只是一个球 一个 2D 圆圈 的自定义 UIView 我会重写drawRect方法吗 有人可以告诉我绘制蓝色圆圈的代码吗 另外 可以在类本身中更改该视图的框架吗 或者我是否需要更改不同类别的框架 只是想设置一个弹跳的球
  • 性能:findIndex 与 Array.prototype.map [重复]

    这个问题在这里已经有答案了 In 2019 如果我正在处理一个长度在 15000 以上的对象数组 并且我需要按值查找对象的索引 那么以下哪种方法将是我在性能方面的最佳选择 六岁的 答案 在对象数组中 查找属性与搜索匹配的对象的索引的最快方法
  • 从Win32_PrintJob获取总页数

    Win32 PrintJob WMI 类具有许多属性 看 MSDN 上的 Win32 PrintJob 我有一个小型 NET 应用程序 用于显示打印作业并显示作业信息 The TotalPages属性给出了发送的页面数量 但该数字并未考虑用
  • 使用 MinGW-w64 在 MSYS2 上编译 BASIS

    我正在努力追随这些说明使用 MinGW w64 编译器在 MSYS2 上编译安装 BASIS CMake 构建系统和软件实现标准 但是 那ccmake 步骤失败 bash ccmake 找不到命令 我尝试通过以下方式搜索 MSYS2 软件包
  • R ggplot2 梯度图离散调色板

    在 SO 用户的帮助下 我现在可以使用以下命令绘制渐变图geom tile and scale fill gradient 现在我需要指定一个固定的调色板 我的第一次尝试是使用scale fill manual但我收到此错误消息 错误 提供
  • 如何在 Smack 中正确监听 MultiUserChat?

    我不确定如何正确监听 MultiUserChats 因为显然有两种不同的方式来监听它们 第一种方法是为每个房间添加一个 MessageListener 如下所示 MultiUserChat muc new MultiUserChat con
  • python中a = x和a=x[:]有什么区别[重复]

    这个问题在这里已经有答案了 我正在努力学习Python 有人可以帮助我理解以下两者之间的区别 a x 与 a x a x创建一个参考 a 2 x a print id a print id x 生产 39727240 39727240 所以
  • 使 log4j 控制台附加程序对不同线程使用不同颜色

    我正在追踪一些并发问题 当登录到控制台时 让每个线程的输出行以不同的颜色显示将非常有帮助 我使用的是 OS X 可以使用转换模式来输出一些控制代码来完成此操作 还是需要自定义附加程序 有人知道怎么做吗 2011 10 21 12 14 42
  • while(*p){p++;} 、while(*++p){;} 和 while(*p++){;} 有什么区别?

    是关于strcat功能 while p p and while p 两者都有效 但是 while p 不起作用 我认为第一和第三应该是相同的 但事实并非如此 我们假设p是一个字符串 while p p 1 while p 2 while p
  • 使用带 MVVM 指示灯的“X”按钮关闭窗口时进行确认

    我正在使用 WPF 和 MVVM Light 框架 我是新使用它们的 我想做以下事情 当用户单击 X 关闭按钮时 我想显示一个确认窗口 以确定他是否要退出应用程序 如果是 则应用程序关闭 如果否 则不会发生任何事情 他仍然可以正常使用该应用