我正在使用WPF和MVVM Light框架(使用它们是我的新手)。
我要执行以下操作:
到目前为止,我有这个:
在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)实际上,如果用户回答“是”或“否”,则两种情况下应用程序都将退出。
我不太确定如何从这里开始...
任何帮助将是巨大的!
谢谢
如果要取消关闭,可以在中使用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)