2

我正在使用 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
        {
          // ????
        }
    

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

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

任何帮助都会很棒!

谢谢

4

2 回答 2

5

如果要取消关闭,可以使用EventToCommandin anEventTrigger来捕获关闭事件并将Cancel传递的属性设置为 true:CancelEventArgs

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;
      } 
   }
}
于 2013-01-18T09:32:05.813 回答
2

如果用户取消关闭,Closing事件参数具有Cancel您需要设置的属性。true因此,您的Cleanup()方法应该返回bool并且您应该将其分配给Cancel属性。

于 2013-01-18T09:11:22.447 回答