Связывание команд 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!");
}
}
}