Связывание команд WPF EditingCommands

Ситуация:

У меня есть несколько команд редактирования в окне WPF и команда закрытия (Application.CloseCommand), и у меня есть некоторые привязки, подобные этой

Посмотреть:

 <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Close"
                        Executed="CloseCommandBinding_Executed"/>
        <CommandBinding Command="EditingCommands.ToggleBold"
                        Executed="EditingCommand_Executed"></CommandBinding>
 </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Key="Esc" Command="ApplicationCommands.Close"></KeyBinding>
    </Window.InputBindings>
.. *Some panel and grid stuff and more things* ..
<RichTextBox Name="RTBPopup">
       <RichTextBox.InputBindings>
            <KeyBinding Key="Esc" Command="ApplicationCommands.Close"></KeyBinding>
       </RichTextBox.InputBindings>
</RichTextBox>
.. *Some panel and grid stuff and more things* ..
<ToggleButton x:Name="btnToggleBold" CommandManager.Executed="EditingCommand_Executed" Command="EditingCommands.ToggleBold" CommandTarget="{Binding ElementName=RTBPopup}">B</ToggleButton>

Сейчас:

Если я нажимаю escape в RTBPopup (Richtextbox), команда выполняется, и отладчик достигает точки останова, установленной на CloseCommandBinding_Executed метод

но

когда я нажимаю на кнопку переключения для полужирного или нажимаю control + B, EditingCommand_Executed не попадает в отладчик (не выполняется)

Что еще я пробовал:

 <ToggleButton.CommandBindings>
      <CommandBinding Command="EditingCommands.ToggleBold" Executed="EditingCommand_Executed"></CommandBinding>
 </ToggleButton.CommandBindings>

1 ответ

Обрабатывать PreviewExecuted событие:

<CommandBinding Command="EditingCommands.ToggleBold" 
                PreviewExecuted="CommandBinding_PreviewExecuted" />

Команда обрабатывается RichTextBox так что это никогда не пузырьки до вашего родителя Window,

Вы также можете попробовать использовать CommandManager подключить обработчик событий программно:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        CommandManager.AddPreviewExecutedHandler(RTBPopup, new ExecutedRoutedEventHandler(OnExecuted));
    }

    private void OnExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        if(e.Command == EditingCommands.ToggleBold)
        {
            MessageBox.Show("fired!");
        }
    }
}
Другие вопросы по тегам