如何注册/监听richtextbox命令?

时间:2010-03-08 08:58:05

标签: wpf richtextbox command

我正在使用WPF RichTextBox在我们的应用程序中创建一个简单的编辑器。在它上面我添加了像Bold,Italic等的reguslar按钮。这些按钮使用RichTextBox的命令来设置这些属性,但是在这些按钮旁边,命令也会通过CTRL + B,CTRL + I等发送.I希望这些按钮代表光标处RichTextBox的当前状态。我已经找到了如何获得此状态,并且当我在SelectionChanged事件上更新此状态时它可以正常工作。当Bold切换时,不会触发此事件,因此没有直接反馈。

我想知道是否有办法听取被调用的命令,而不影响其原始行为或其他一些想法来解决我的问题。

我试着按照以下方式听命令:

   CommandBinding boldBinding = new CommandBinding(EditingCommands.ToggleBold, CommandExecuted);
  _richTextBox.CommandBindings.Add(boldBinding);   

private void CommandExecuted(object sender, ExecutedRoutedEventArgs e) {
  UpdateProperties();
  e.Handled = false;      
}

这确实更新了属性,但RichTextBox似乎不再接收命令。

我还尝试在包含RichTextBox的控件上创建自己的命令,但是当RichTextBox具有焦点时按下CTRL + B时​​,将调用原始RichTextBox命令而不是新命令。

非常感谢提前!

Liewe

1 个答案:

答案 0 :(得分:2)

为了侦听被调用的命令,您可以使用CommandManager引发的事件:Executed或PreviewExecuted。

如果您将XAML更改为:

<RichTextBox x:Name="_richTextBox" ... 
    CommandManager:PreviewExecuted="OnRichTextBoxCommand" ... />

在执行命令之前,您将获得正确调用的OnRichTextBoxCommand方法。不幸的是,使用Executed附加事件不起作用。

为每个事件调用此方法,因此您必须对它们进行过滤:

    private void OnRichTextBoxCommand(object sender, ExecutedRoutedEventArgs e) {

        if (e.Command == EditingCommands.ToggleBold) {
            UpdateProperties();
        }
    }

它甚至可能更复杂一些,因为调用此方法时当前选择可能没有改变,因此您必须自己发布一条消息,例如像这样:

            Dispatcher.BeginInvoke(new Action(UpdateProperties));

(如果你已经引用了System.Core,你有Action类型,否则定义一个不带参数并返回void的委托,而是使用in。)