Wpf MahApps Metro捕获关闭窗口事件

Wpf MahApps Metro捕获关闭窗口事件,wpf,mahapps.metro,Wpf,Mahapps.metro,我使用的是MahApps Metro窗口样式,我希望在用户单击窗口的关闭按钮时捕获事件 我已经将我的关机模式设置为OnExplicitShutdown,所以我需要调用Application.Current.Shutdown()单击该按钮时 我怎样才能做到这一点?我相信我也在尝试使用WPF和MahApps.Metro做与您相同的事情(绑定到关闭窗口按钮)。我还没有找到明确绑定到该命令的方法,但是通过将ShowCloseButton属性设置为false(隐藏它),然后创建自己的close窗口命令按钮

我使用的是MahApps Metro窗口样式,我希望在用户单击窗口的关闭按钮时捕获事件

我已经将我的关机模式设置为OnExplicitShutdown,所以我需要调用
Application.Current.Shutdown()单击该按钮时


我怎样才能做到这一点?

我相信我也在尝试使用WPF和MahApps.Metro做与您相同的事情(绑定到关闭窗口按钮)。我还没有找到明确绑定到该命令的方法,但是通过将ShowCloseButton属性设置为false(隐藏它),然后创建自己的close窗口命令按钮并处理viewmodel中的逻辑,我能够完成这一任务。我进行了一些挖掘,但我发现您可以使用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的构造函数中

在您的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}" />

因为我找不到如何通过编程实现这一点(我的窗口没有Xaml文件,它只是一个基类),所以来自gotapps.net的解决方案对我不起作用。我找到了另一种解决方法,可以使用相同的按钮关闭窗口,如下所示:

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);
        }
}
内部类基窗口:MetroWindow
{
公共基本窗口()
{
this.Loaded+=BaseWindow\u Loaded;
}
已加载void BaseWindow_(对象发送方,事件参数e)
{
按钮关闭=此.FindChild(“部分关闭”);
关闭。单击+=关闭\u单击;
}
无效关闭\单击(对象发送者,路由目标e)
{
应用。当前。关机(0);
}
}
您可以使用“关闭”或“关闭”事件

关闭处理程序在用户单击关闭按钮时触发。这还可以让您控制是否应该关闭应用程序

类似地,关闭的处理程序在窗口关闭之前被触发

<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>

<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>