Команда привязки к X-кнопке строки заголовка окна - PullRequest
0 голосов
/ 24 мая 2010

В моем окне обслуживания WPF есть панель инструментов с кнопкой «Выход»;CommandExit связывается с этой кнопкой.CommandExit выполняет некоторые проверки перед выходом.

Теперь, если я нажму кнопку закрытия окна (кнопка «x» в строке заголовка), эти проверки игнорируются.

Как это сделать, чтобыпривязать CommandExit к оконной кнопке x?

Ответы [ 2 ]

6 голосов
/ 24 мая 2010

Я полагаю, вы можете отменить закрытие на основании этих условий? Вам нужно использовать событие закрытия , которое передает вам System.ComponentModel.CancelEventArgs для отмены закрытия.

Вы можете либо перехватить это событие в коде позади и выполнить команду вручную, либо, и это будет предпочтительный подход, вы можете использовать прикрепленное поведение, чтобы перехватить событие и запустить команду.

Что-то вроде (и я не проверял это):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Input;

namespace Behaviors
{
    public class WindowCloseBehavior : Behavior<Window>
    {
        /// <summary>
        /// Command to be executed
        /// </summary>
        public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(WindowCloseBehavior), new UIPropertyMetadata(null));

        /// <summary>
        /// Gets or sets the command
        /// </summary>
        public ICommand Command
        {
            get
            {
                return (ICommand)this.GetValue(CommandProperty);
            }

            set
            {
                this.SetValue(CommandProperty, value);
            }
        }

        protected override void OnAttached()
        {
            base.OnAttached();

            this.AssociatedObject.Closing += OnWindowClosing;
        }

        void OnWindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (this.Command == null)
                return;

            // Depending on how you want to work it (and whether you want to show confirmation dialogs etc) you may want to just do:
            // e.Cancel = !this.Command.CanExecute();
            // This will cancel the window close if the command's CanExecute returns false.
            //
            // Alternatively you can check it can be excuted, and let the command execution itself
            // change e.Cancel

            if (!this.Command.CanExecute(e))
                return;

            this.Command.Execute(e);
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();

            this.AssociatedObject.Closing -= OnWindowClosing;
        }

    }
}
0 голосов
/ 24 мая 2010

Вы должны реализовать обработчик события вашего главного окна «Закрытие», где вы можете выполнять проверки и отменять действие закрытия. Это самый простой способ сделать это, однако в противном случае вам придется изменить дизайн всего окна и его темы.

...