在带有MVVM指示灯的'X'按钮关闭窗口时进行确认

Rom*_*ain 2 wpf mvvm-light

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

我要执行以下操作:

  1. 当用户单击“ X”关闭按钮时,如果他是否要退出该应用程序,我想显示一个确认窗口。
  2. 如果是,则应用程序关闭
  3. 如果没有,则什么也没有发生,他仍然可以照常使用该应用程序

到目前为止,我有这个:

  • 在MainWindow.xaml.cs中:

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

    public static void Cleanup()
    {
        ServiceLocator.Current.GetInstance<MainViewModel>().Cleanup();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在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
        {
          // ????
        }
    
    Run Code Online (Sandbox Code Playgroud)

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

我不太确定如何从这里开始...

任何帮助将是巨大的!

谢谢

Jür*_*yer 5

如果要取消关闭,可以在中使用EventToCommandin 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>
Run Code Online (Sandbox Code Playgroud)

ViewModel:

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;
      } 
   }
}
Run Code Online (Sandbox Code Playgroud)