Как зарегистрироваться / прослушать команду richtextbox? - PullRequest
0 голосов
/ 08 марта 2010

Я создаю простой редактор в нашем приложении, используя WPF RichTextBox. Выше я добавил кнопки reguslar, такие как Bold, Italic и т. Д. Эти кнопки используют команды RichTextBox для установки этих свойств, но рядом с этими кнопками команды также отправляются с помощью CTRL + B, CTRL + 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, но когда нажата клавиша CTRL + B, когда RichTextBox имеет фокус, вместо новой команды вызываются оригинальные команды RichTextBox.

Большое спасибо заранее!

Liewe

1 Ответ

2 голосов
/ 08 марта 2010

Для прослушивания вызываемых команд вы можете использовать события, вызванные CommandManager: Executed или PreviewExecuted.

Если вы измените свой XAML на:

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

вы получаете метод OnRichTextBoxCommand, вызываемый непосредственно перед выполнением команды. К сожалению, использование события «Выполнено» не работает.

Этот метод вызывается для каждого события, поэтому вы должны отфильтровать их:

    private void OnRichTextBoxCommand(object sender, ExecutedRoutedEventArgs e) {

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

Это может быть даже немного сложнее, так как текущий выбор, возможно, не изменился при вызове этого метода, поэтому вы должны опубликовать себе сообщение, например, как это:

            Dispatcher.BeginInvoke(new Action(UpdateProperties));

(если вы уже ссылаетесь на System.Core, у вас есть тип Action, в противном случае определите делегат, не имеющий параметров и возвращающий void, и используйте вместо него.)

...