【发布时间】:2020-06-12 12:13:40
【问题描述】:
我正在使用 MahApps Metro 窗口样式,我想在用户单击窗口的关闭按钮时捕获事件。
我已将 ShutdownMode 设置为 OnExplicitShutdown,因此我需要在单击该按钮时调用 Application.Current.Shutdown();
我该怎么做?
【问题讨论】:
标签: wpf mahapps.metro
我正在使用 MahApps Metro 窗口样式,我想在用户单击窗口的关闭按钮时捕获事件。
我已将 ShutdownMode 设置为 OnExplicitShutdown,因此我需要在单击该按钮时调用 Application.Current.Shutdown();
我该怎么做?
【问题讨论】:
标签: wpf mahapps.metro
我相信我也在尝试使用 WPF 和 MahApps.Metro 做与您相同的事情(绑定到关闭窗口按钮)。我还没有找到明确绑定到该命令的方法,但我能够通过将 ShowCloseButton 属性设置为 false(隐藏它)来完成此操作,然后创建我自己的关闭窗口命令按钮并处理其中的逻辑我的视图模型。花了我一些时间,但我发现您可以使用 MahApps.Metro 在命令栏中轻松添加自己的窗口命令控件,只需将类似的标记添加到您的 XAML:
<Controls:MetroWindow.WindowCommands>
<Controls:WindowCommands>
<Button Content="X" Command="{Binding CancelCommand}" />
</Controls:WindowCommands>
</Controls:MetroWindow.WindowCommands>
【讨论】:
您需要创建一个 DependencyProperty 来处理关闭窗口的行为:
依赖属性
namespace MyApp.DependencyProperties
{
public class WindowProperties
{
public static readonly DependencyProperty WindowClosingProperty =
DependencyProperty.RegisterAttached("WindowClosing", typeof(RelayCommand), typeof(WindowProperties), new UIPropertyMetadata(null, WindowClosing));
public static object GetWindowClosing(DependencyObject depObj)
{
return (RelayCommand)depObj.GetValue(WindowClosingProperty);
}
public static void SetWindowClosing(DependencyObject depObj, RelayCommand value)
{
depObj.SetValue(WindowClosingProperty, value);
}
private static void WindowClosing(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
var element = (Window)depObj;
if (element != null)
element.Closing += OnWindowClosing;
}
private static void OnWindowClosing(object sender, CancelEventArgs e)
{
RelayCommand command = (RelayCommand)GetWindowClosing((DependencyObject)sender);
command.Execute((Window)sender);
}
}
}
在您的 ViewModel 中
public RelayCommand WindowClosedCommand { get; set; }
private void WindowClose()
{
Application.Current.Shutdown();
}
在 ViewModel 的构造函数中
this.WindowCloseCommand = new RelayCommand(WindowClose);
在您的 XAML 中
<mah:MetroWindow x:Class="MyApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:dp="clr-namespace:MyApp.DependencyProperties"
dp:WindowProperties.WindowClosing="{Binding WindowClosedCommand}" />
【讨论】:
由于 gotapps.net 的解决方案对我不起作用,因为我没有找到如何以编程方式执行此操作(我的窗口没有 Xaml 文件,它只是一个基类)。我找到了另一种解决方法,使用相同的按钮关闭窗口,如下所示:
internal class BaseWindow : MetroWindow
{
public BaseWindow()
{
this.Loaded += BaseWindow_Loaded;
}
void BaseWindow_Loaded(object sender, EventArgs e)
{
Button close = this.FindChild<Button>("PART_Close");
close.Click += close_Click;
}
void close_Click(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown(0);
}
}
【讨论】:
您可以使用“Closing”或“Closed”事件
当用户点击关闭按钮时触发关闭处理程序。这也使您可以控制是否应关闭应用程序。
同样,关闭处理程序在窗口关闭之前触发
<Controls:MetroWindow x:Class="MyClass.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
Title="My Class"
Closing="MainWindow_OnClosing">
</Controls:MetroWindow>
【讨论】: