我正在使用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
答案 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。)