4

我正在寻找一种能够在命令执行后运行事件的方法。我正在使用 EditingCommands(ToggleBold、ToggleItalic...等),并希望能够在命令完成任何操作后直接调用一个方法。

例如,我选择了一些文本并按 Ctrl+B 并执行 EditingCommands.ToggleBold。在文本切换后,我想调用一个方法来更新与选择 FontWeight 连接的 ToggleButton。

我尝试使用该Executed事件,但不幸的是,我在文本受到影响之前调用了该事件,因此使用将在一秒钟内更改的信息更新按钮。有谁知道解决这个问题的方法?

4

2 回答 2

4

一种解决方法是在您的 Executed 处理程序中排队另一条消息:

void copy_Executed(object sender, EventArgs e)
{
    Dispatcher.BeginInvoke(new ThreadStart(delegate()
    {
        //do update of bold button here
    }), null);
}

这将确保您的工作被添加到队列的后面,并将在具有相同或更高优先级的其他消息之后执行。

但是,我想提出一个更好的解决方案。如果您考虑一下,粗体按钮负责执行两个不同的命令:加粗和正常。它根据当前选择的文本/插入符号位置在这两个命令之间切换。因此,您可以编写一个自定义ICommand实现来封装两个子命令(完全未经测试的代码):

public class TogglingCommand : ICommand
{
    private readonly ICommand _command1;
    private readonly ICommand _command2;
    private ICommand _activeCommand;

    public TogglingCommand(ICommand command1, ICommand command2)
    {
        _command1 = command1;
        _command2 = command2;
    }

    public ICommand ActiveCommand
    {
        get { return _activeCommand; }
    }

    public bool CanExecute(object parameter)
    {
        if (_command1.CanExecute(parameter))
        {
            _activeCommand = _command1;
        }
        else if (_command2.CanExecute(parameter))
        {
            _activeCommand = _command2;
        }
        else
        {
            _activeCommand = null;
        }

        return _activeCommand != null;
    }

    public void Execute(object parameter)
    {
        _activeCommand.Execute(parameter);
    }
}

然后,您可以TogglingCommand使用两个命令构造 a:一个用于加粗文本,另一个用于取消粗体文本。然后,您可以将ButtonUI 中的 绑定到ActiveCommand属性,以根据单击命令时发生的情况以您喜欢的方式更改它。例如,如果您正在使用 aToggleButton您将绑定IsCheckedActiveCommand并转换为true活动命令是非粗体。当然,粗体和非粗体命令需要CanExecute它们自己的逻辑来检查所选文本。

于 2009-03-29T10:28:41.063 回答
0

您可以使用已执行(过去时)路由事件处理程序吗?(或者也许这就是你所说的你尝试过的)

public partial class CustomerWindow : Window
{
    public CustomerWindow()
    {
        InitializeComponent();

        CommandBinding binding = new CommandBinding(ApplicationCommands.Copy);
        binding.Executed += new ExecutedRoutedEventHandler(this.copy_Executed);
        this.CommandBindings.Add(binding);
    }

    void copy_Executed(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Executed the Copy command");
    }
} 
于 2009-03-29T09:44:01.217 回答