Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在命令执行后调用事件_C#_Wpf_Events_.net 3.5_Command - Fatal编程技术网

C# 在命令执行后调用事件

C# 在命令执行后调用事件,c#,wpf,events,.net-3.5,command,C#,Wpf,Events,.net 3.5,Command,我正在寻找一种能够在命令执行后运行事件的方法。我正在使用EditingCommands(ToggleBold、ToggleItalic…等等),希望能够在命令完成任何操作后直接调用一个方法 例如,我选择了一些文本并按下Ctrl+B,然后执行EditingCommands.ToggleBold。在文本被切换之后,我想调用一个方法来更新与选择FontWeight连接的切换按钮 我尝试使用Executed事件,但不幸的是,在文本受到影响之前,我调用了该事件,并因此使用信息更新按钮,这些信息将在一秒钟内

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

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

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

您能使用已执行(过去时)路由事件处理程序吗?(或者你是说你试过了)


解决方法是在已执行的处理程序中将另一条消息排队:

void copy_Executed(object sender, EventArgs e)
{
    Dispatcher.BeginInvoke(new ThreadStart(delegate()
    {
        //do update of bold button here
    }), null);
}
这将确保您的工作被添加到队列的后面,并且将在具有相同或更高优先级的其他消息之后执行

然而,我想提出一个更好的解决方案。仔细想想,粗体按钮负责执行两个不同的命令:makebold和makenormal。它根据当前选定的文字/插入符号位置在这两个命令之间切换。因此,您可以编写一个自定义的
ICommand
实现来封装两个子命令(完全未测试的代码):


然后,您可以使用两个命令构造一个
TogglingCommand
:一个用于加粗,另一个用于取消绑定文本。然后,您可以将UI中的
按钮
绑定到
ActiveCommand
属性,根据单击命令时发生的情况以您喜欢的方式对其进行更改。例如,如果您使用的是
ToggleButton
,则将
IsChecked
绑定到
ActiveCommand
,并将其转换为
true
即激活的命令解除绑定。当然,bolden和unbolden命令需要执行它们自己的逻辑来检查所选文本。

谢谢Kent。我发现我真正的问题是,当我设置其中一个EditingCommand的已执行处理程序时,它不会调用它们的默认处理程序。我没有注意到这一点,因为我在网格中设置了CommandBindings,而不是RichTextBox,所以它们无法工作。我会实现它们,这就是我所尝试的。正如我在Kent对答案的评论中提到的,这不起作用,因为它似乎覆盖了默认的编辑命令,即使e.Handled=false;
void copy_Executed(object sender, EventArgs e)
{
    Dispatcher.BeginInvoke(new ThreadStart(delegate()
    {
        //do update of bold button here
    }), null);
}
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);
    }
}