2011-02-23 14 views
3

WPFで効果的に "エイリアス"コマンドを実行する方法はありますか?私の状況は次のとおりです。カスタマイズされたキャンバスを数多く持つグラフィカルエディタのコンテキストでApplicationCommands.Deleteを使用するアプリケーションを作成しました。これらのキャンバスにあるコントロールの中には、TextBoxesを使用するものがありますが、ここでは問題があります.TextBoxはApplicationCommands.Deleteに応答せず、EditorCommands.Deleteに応答します。 TextBoxをサブクラス化せずに、またはすべてのTextBoxインスタンスでバインディングを手動で設定せずに、ApplicationCommands.Deleteに応答するようにTextBoxをきれいに取得する方法はありますか?WPFでエイリアスコマンドを実行する方法はありますか?

答えて

2

あなたの特定の質問に答えるために、2つの別々のルーティングされたコマンドを同じコマンドとして扱う方法はありません。しかし、ApplicationCommands.Deleteはルーティングされたコマンドであるため、ターゲットに配信された後、TextBoxがあり、コマンドバインディングは存在しないため、バブリングが開始されます。したがって、あなたの要件を満たす最も簡単な解決策は、ApplicationCommands.DeleteのコマンドバインディングをTextBoxのどこかにインストールして、あなたが望む動作を実装するWindowを含む可能性があります。

<Grid> 
    <Grid.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.Delete" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/> 
    </Grid.CommandBindings> 
    <DockPanel> 
     <Menu DockPanel.Dock="Top"> 
      <MenuItem Header="_Edit"> 
       <MenuItem Header="_Delete" Command="ApplicationCommands.Delete"/> 
      </MenuItem> 
     </Menu> 
     <StackPanel> 
      <TextBox Text="Some text"/> 
     </StackPanel> 
    </DockPanel> 
</Grid> 

、ここでは、コードビハインドです:

ここ

は、この場合にはTextBoxなりますフォーカスのある要素を命じる「右」を送信し、親Gridのハンドラをインストール例です

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = true; 
} 

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    EditingCommands.Delete.Execute(null, Keyboard.FocusedElement); 
} 
関連する問題