Могу ли я расширить маршрутизацию команд WPF таким образом, чтобы сначала проверить, может ли команда вызываться в сфокусированном поле, а если не в каком-то другом (никогда не меняющемся)? Есть ли крючки для этого? Может быть, вы не знаете, будет ли это работать, но что-то подобное увидит где-то в сети и может сэкономить ссылку?Как переписать WPF маршрутизируемые команды диспетчерский механизм
Аннотация пример
Например, если я буду писать текстовый редактор с боковой панелью и панелью будет иметь фокус. Если я нажму Ctrl + G, будет вызвана какая-то команда, потому что панель имеет привязку и фокус команды (это обычное поведение WPF). Также, если я нажимаю Ctrl + H, но на этой панели времени нет команды привязки для вызванной команды. В этом случае я хотел бы, чтобы механизм маршрутизации переключился на текстовый редактор и применил к нему такую же команду.
Реальный пример
У меня есть пункт меню, который говорит Paste, но фокус находится на боковой панели. Если я нажму кнопку меню, привязанную к панели, будет выполнена. Предположим, что нет соответствующей команды, привязанной к панели. В этом случае я хотел бы вставить в текстовый редактор.
Код
Этот код более или менее представляет этот сценарий. Я хотел бы, чтобы нажать Ctrl + H и выполнить CommandBinding_Executed_1
Window1.xaml
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<StackPanel>
<TextBox x:Name="textBlock1">
<TextBox.CommandBindings>
<CommandBinding Command="local:Window1.TestCommand" Executed="CommandBinding_Executed_1" />
<CommandBinding Command="local:Window1.ForwardedTestCommand" Executed="CommandBinding_Executed_1" />
</TextBox.CommandBindings>
</TextBox>
<TextBox x:Name="textBlock2">
<TextBox.CommandBindings>
<CommandBinding Command="local:Window1.TestCommand" Executed="CommandBinding_Executed_2" />
</TextBox.CommandBindings>
<TextBox.InputBindings>
<KeyBinding Command="local:Window1.TestCommand" Gesture="Ctrl+G" />
<KeyBinding Command="local:Window1.ForwardedTestCommand" Gesture="Ctrl+H" />
</TextBox.InputBindings>
</TextBox>
</StackPanel>
</Window>
Window1.xaml.cs
using System.Windows;
using System.Windows.Input;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public static RoutedUICommand TestCommand = new RoutedUICommand("TestCommand", "TestCommand", typeof(Window1));
public static RoutedUICommand ForwardedTestCommand = new RoutedUICommand("ForwardedTestCommand", "ForwardedTestCommand", typeof(Window1));
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("CommandBinding_Executed_1");
}
private void CommandBinding_Executed_2(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("CommandBinding_Executed_2");
}
}
}