2009-06-12 2 views
3

Могу ли я расширить маршрутизацию команд 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"); 
     } 
    } 
} 

ответ

0

так, как я был в состоянии решить это используя метод Window.AddHandler, чтобы поймать все маршрутизированные командные события, а затем повторно собрать их из textBlock1, как это.

textBlock1.RaiseEvent (e);

У меня нет коды для этого пока нет, но идея состоит в том, что маршрутизации событие, если не обрабатываются продувает до оконной сферы, где мы ловим все необработанные события и вновь поднять их из главного окна области