命令执行后调用事件

时间:2009-03-29 09:21:12

标签: c# wpf events .net-3.5 command

我正在寻找一种能够在命令执行后运行事件的方法。我正在使用EditingCommands(ToggleBold,ToggleItalic等等),并且希望能够在命令完成它正在做的任何事情之后直接调用一个方法。 一个例子是我选择了一些文本并按Ctrl + B并执行EditingCommands.ToggleBold。在文本切换之后,我想调用一个方法来更新与选择FontWeight连接的ToggleButton。 我尝试使用Executed事件但不幸的是,在文本受到影响之前调用了这个事件,因此更新了按钮,信息会在一秒钟后发生变化。有没有人知道这方面的方法?谢谢你的帮助!

干杯

2 个答案:

答案 0 :(得分:4)

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

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

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

但是,我想建议一个更好的解决方案。如果你考虑一下,粗体按钮负责执行两个不同的命令:make bold,make normal。它根据当前选择的文本/插入符号位置在这两个命令之间切换。因此,您可以编写一个自定义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:一个用于bolden,另一个用于unbolden文本。然后,您可以将UI中的Button绑定到ActiveCommand属性,以便根据您单击命令时将发生的情况进行更改。例如,如果您使用ToggleButton,则将IsChecked绑定到ActiveCommand并转换为true,则活动命令为unbolden。当然,bolden和unbolden命令需要自己的CanExecute逻辑来检查所选文本。

答案 1 :(得分: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");
    }
} 
相关问题