0

我的 WPF 维护窗口有一个带有“退出”按钮的工具栏;CommandExit 与此按钮绑定。CommandExit 在退出前执行一些检查。

现在,如果我单击关闭窗口的按钮(标题栏的 x 按钮),则会忽略此检查。

如何将 CommandExit 绑定到窗口 x 按钮?

4

2 回答 2

6

我假设您可能想根据这些条件取消关闭?您需要使用Closing 事件,它会向您传递 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;
        }

    }
}
于 2010-05-24T07:40:01.510 回答
0

您必须实现主窗口事件“关闭”的事件处理程序,您可以在其中进行检查并取消关闭操作。这是最简单的方法,但否则您必须重新设计整个窗口及其主题。

于 2010-05-24T07:56:36.157 回答