2015-10-15 5 views
1

У меня есть следующая настройка для моих команд. Я не могу понять, как я ссылаюсь на окно, на котором моя кнопка включена, так что я могу закрыть ее.Отправить окно как параметр команды

Есть ли способ использовать аргументы команды ExecutedRoutedEventArgs e для ссылки на окно и закрыть его?

Кнопка (на MainWindow.xaml)

<Button Command="Commands:MyCommands.CloseWindow">&#10006;</Button> 

Вот мои команды, которые расположены в

Классы> Commands.cs

namespace Duplicate_Deleter.Classes 
{ 
    public class MyCommands 
    { 
     private static RoutedUICommand _CloseWindow; 
     private static RoutedUICommand _MinimizeWindow; 

     static MyCommands() 
     { 
      _CloseWindow = new RoutedUICommand("Close current window", 
          "CloseWindow", typeof(MyCommands)); 
      _MinimizeWindow = new RoutedUICommand("Minimize current window", 
          "MinimizeWindow", typeof(MyCommands)); 
     } 

     public static void BindCommandsToWindow(Window window) 
     { 
      window.CommandBindings.Add(
       new CommandBinding(CloseWindow, CloseWindow_Executed, CloseWindow_CanExecute)); 
      window.CommandBindings.Add(
       new CommandBinding(MinimizeWindow, MinimizeWindow_Executed, MinimizeWindow_CanExecute)); 
     } 

     // Command: CloseWindow 
     public static RoutedUICommand CloseWindow 
     { 
      get { return _CloseWindow; } 
     } 
     public static void CloseWindow_Executed(object sender, 
        ExecutedRoutedEventArgs e) 
     { 
      //Close window using e? 
     } 
     public static void CloseWindow_CanExecute(object sender, 
          CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = true; 
     } 

     // Command: MinimizeWindow 
     public static RoutedUICommand MinimizeWindow 
     { 
      get { return _MinimizeWindow; } 
     } 
     public static void MinimizeWindow_Executed(object sender, 
        ExecutedRoutedEventArgs e) 
     { 
      MessageBox.Show("Minimize Window"); 
     } 
     public static void MinimizeWindow_CanExecute(object sender, 
          CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = true; 
     } 
    } 
} 

Я связываю команд с использованием настраиваемого запуска в

App.xaml.cs

/// <summary> 
/// Interaction logic for App.xaml 
/// </summary> 
public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     //Startup 
     Window main = new MainWindow(); 
     main.Show(); 

     //Bind Commands 
     Classes.MyCommands.BindCommandsToWindow(main); 
    } 
} 

ответ

1

Я попробовал этот путь, и это работает для меня:

 private void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     var dObj = e.Source as DependencyObject; 
     if(dObj == null) return; 
     var parentWindow = dObj.GetVisualParentOfType<Window>(); 
     if(parentWindow == null) 
      return; 
     parentWindow.Close(); 
    } 

Helper:

public static T GetVisualParentOfType<T>(this DependencyObject child) 
     where T : DependencyObject 
    { 
     var parentObject = VisualTreeHelper.GetParent(child); 
     if (parentObject == null) return null; 
     var parent = parentObject as T; 
     return parent ?? GetVisualParentOfType<T>(parentObject); 
    } 

иметь в виду, что вспомогательный метод является метод расширения, который ставится в открытый статический класс.

С уважением

+0

У нас есть очень удобный метод 'Window.GetWindow (...)', в этом случае он должен быть простым, как этот 'ParentWindow = Window.GetWindow (dObj);' без идти вверх визуальное дерево. –

+1

@KingKing спасибо. – Ilan

Смежные вопросы