2010-03-08 41 views
0

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

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

我试着听命令的方式如下:

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

回答

2

为了听命令被调用,您可以使用命令管理引发的事件:已执行或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程序,您有行动的类型,否则定义委托采取任何参数和返回void,而是使用)

+0

该做的伎俩!非常感谢你! – Liewe 2010-03-08 13:33:16