作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
单击“取消”按钮(或右上角的“X”或“Esc”)后如何取消退出特定表单?
WPF:
<Window
...
x:Class="MyApp.MyView"
...
/>
<Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/>
</Window>
View 模型:
public class MyViewModel : Screen {
private CancelCommand cancelCommand;
public CancelCommand CancelCommand {
get { return cancelCommand; }
}
public MyViewModel() {
cancelCommand = new CancelCommand(this);
}
}
public class CancelCommand : ICommand {
public CancelCommand(MyViewModel viewModel) {
this.viewModel = viewModel;
}
public override void Execute(object parameter) {
if (true) { // here is a real condition
MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
"Really close?", "Warning",
System.Windows.MessageBoxButton.YesNo);
if (messageBoxResult == MessageBoxResult.No) { return; }
}
viewModel.TryClose(false);
}
public override bool CanExecute(object parameter) {
return true;
}
}
当前代码无效。如果用户在弹出对话框中选择“否”,我希望用户留在当前表单上。此外,覆盖 CanExecute 也无济于事。它只是禁用按钮。我想让用户点击按钮,但随后通知他/她,数据将会丢失。也许我应该在按钮上分配一个事件监听器?
编辑:
我设法在“取消”按钮上显示弹出窗口。但我仍然无法管理 Esc 或 X 按钮(右上角)。看来我对取消按钮感到困惑,因为当我单击 X 按钮或 Esc 时执行 Execute 方法。
编辑2:
我改变了问题。这是“如何取消取消按钮”。但是,这不是我想要的。我需要取消 Esc 或 X 按钮。在“MyViewModel”中,我添加:
protected override void OnViewAttached(object view, object context) {
base.OnViewAttached(view, context);
(view as MyView).Closing += MyViewModel_Closing;
}
void MyViewModel_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
if (true) {
MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
"Really close?", "Warning",
System.Windows.MessageBoxButton.YesNo);
if (messageBoxResult == MessageBoxResult.No) {
e.Cancel = true;
}
}
}
这解决了我的问题。但是,我需要 ICommand 了解单击了哪个按钮,保存或取消。有什么方法可以消除事件的使用吗?
最佳答案
您正在尝试在 ViewModel 类中执行 View 的工作。让您的 View 类处理关闭请求以及是否应取消。
要取消关闭窗口,您可以订阅 View 的 Closing
事件,并在显示 MessageBox
后将 CancelEventArgs.Cancel
设置为 true .
这是一个例子:
<Window
...
x:Class="MyApp.MyView"
Closing="OnClosing"
...
/>
</Window>
代码隐藏:
private void OnClosing(object sender, CancelEventArgs e)
{
var result = MessageBox.Show("Really close?", "Warning", MessageBoxButton.YesNo);
if (result != MessageBoxResult.Yes)
{
e.Cancel = true;
}
// OR, if triggering dialog via view-model:
bool shouldClose = ((MyViewModel) DataContext).TryClose();
if(!shouldClose)
{
e.Cancel = true;
}
}
关于c# - 如何在 MVVM WPF 应用程序中取消窗口关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36129372/
我是一名优秀的程序员,十分优秀!