c# - 命令执行后调用事件

标签 c# wpf events .net-3.5 command

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

例如,我选择了一些文本并按 Ctrl+B 并执行了 EditingCommands.ToggleBold。切换文本后,我想立即调用一个方法来更新与所选内容 FontWeight 相关联的 ToggleButton。

我尝试使用 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:一个用于加粗文本,一个用于取消加粗文本。然后,您可以将 UI 中的 Button 绑定(bind)到 ActiveCommand 属性,以根据单击命令时发生的情况以您喜欢的方式更改它。例如,如果您使用的是 ToggleButton,您可以将 IsChecked 绑定(bind)到 ActiveCommand 并转换为 true主动命令是不加粗的。当然,bolden 和 unbolden 命令需要它们自己的 CanExecute 逻辑来检查所选文本。

关于c# - 命令执行后调用事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694371/

相关文章:

c# - 我们如何获得相对于窗体的位置?

c# - 如何在 Rx 中创建 Observable "channel"?

c# - Escape for folder Exists and Create 目的

c# - 如何更改asp面板中分组文本的颜色

c# - 确定哪个文本框触发了文本更改事件

.net - 在 WPF 字体大小和 "standard"字体大小之间转换

WPF : Binding Order

java - 我可以在 Android 中通过按键时的后台应用程序以编程方式生成触摸事件吗?

c# - 如何取消注册 'anonymous' 事件处理程序

C# 丢失嵌套列表中的值