1

使用 WPF,我正在构建一个非常简单的文档编辑器,它将提供基本的格式化功能,例如修改用户文本外观的能力,即下划线、粗体、更改字体大小等。

我已经为用户的输入实现了几个 RichTextBox,并希望显示一个按钮来说明类似于 Microsoft Word 的格式选项的切换状态。例如,如果用户按下 CTRL+B,所有输入的文本都将是粗体,而“粗体”按钮则反映这种状态(按下)。

此时,按钮的 IsChecked 属性(使用自定义按钮),被绑定到一个 Property (IsSelectedTextBold)。使用 richTextBox.SelectionChanged 检测选择更改,我调用 OnPropertyChanged("IsSelectedTextBold") (定义如下)。这按预期工作;但是,当用户突出显示一个单词并按下 CTRL+B 时,选择的字体粗细更改为粗体,但按钮不反映更改,因为没有引发 richTextBox.SelectionChanged 事件。寻找一种方法来检测用户何时按下 CTRL+B,我注册了自己的 CommandBinding:

CommandManager.RegisterClassCommandBinding(typeof(RichTextBox),
    new CommandBinding(EditingCommands.ToggleBold, 
    new ExecutedRoutedEventHandler(ToggleBold_Executed),
    new CanExecuteRoutedEventHandler(ToggleBold_CanExecute)));

ToggleBold_Executed() 实现切换粗体并调用 OnPropertyChanged("IsSelectedTextBold") 以通知按钮发生了更改。

出于某种原因,PropertyChanged 设置为 null,并且在从 ToggleBold_Executed() 函数引发时不会触发,但在 RichTextBox_SelectionChanged 事件调用时工作正常。

作为旁注,我还考虑将 Button 的 IsChecked 属性绑定到 RichTextBox.FontWeight(使用必要的转换器)。唯一阻止我这样做的是拥有多个 RichTextBox。不确定是否要动态绑定和取消绑定按钮到活动的 RichTextBox。

感谢您忍受冗长的帖子 - 任何帮助将不胜感激。谢谢!

private void OnPropertyChanged(string propertyName)
{
  if (this.PropertyChanged != null)
  {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}
4

1 回答 1

1

我仍然没有找到原始问题的答案,但这里有一篇博客文章,为我的目标提供了解决方案:http: //www.howtocode.net/software-development/general/extending-wpf-commands

于 2009-07-23T11:12:33.537 回答