2013-12-04 3 views
4

Я использую стиль окна Metro MahApps, и я хочу зафиксировать событие, когда пользователь нажимает кнопку закрытия окна.MahApps Metro capture close window event

Я установил свой ShutdownMode в OnExplicitShutdown так что мне нужно позвонить Application.Current.Shutdown();, когда эта кнопка нажата

Как я могу это сделать?

ответ

1

Я считаю, что я также пытаюсь сделать то же самое, что и вы (привязать к кнопке закрытия окна) с помощью WPF и MahApps.Metro. Мне не удалось найти способ связать эту команду явно, но я смог это сделать, установив для свойства ShowCloseButton значение false (чтобы скрыть его), а затем создал свою собственную командную кнопку закрытия окна и обработал логику в мой viewmodel. Взял меня некоторое рытье, но я обнаружил, что вы можете легко добавить свои собственные элементы управления окном команд в командной строке с MahApps.Metro просто добавить подобную разметку для XAML:

<Controls:MetroWindow.WindowCommands> 
    <Controls:WindowCommands> 
     <Button Content="X" Command="{Binding CancelCommand}" /> 
    </Controls:WindowCommands> 
</Controls:MetroWindow.WindowCommands> 
1

Вам нужно создать DependencyProperty, чтобы справиться с близко поведение окна:

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}" /> 
1

Поскольку решение от gotapps.net did't работал для меня, потому что я нашел did't как это сделать программно (в моем окне нет файла 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); 
     } 
}