3

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

4

1 に答える 1

2

特定の質問に答えるために、2 つの別々のルーティングされたコマンドを同じコマンドとして処理する方法を知りません。しかし、ApplicationCommands.Deleteはルーティングされたコマンドであるため、ターゲットに配信された後、TextBoxコマンド バインディングがなく、泡立ち始めます。したがって、要件を満たす最も簡単な解決策は、必要な動作を実装するまで、場合によっては を含む間のApplicationCommands.Deleteどこかにコマンド バインディングをインストールすることです。TextBoxWindow

Gridこれは、「正しい」コマンドを送信する親にハンドラーをインストールする例です。この場合、フォーカスされた要素は次のようになりTextBoxます。

<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>

コードビハインドは次のとおりです。

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);
}
于 2011-02-24T04:32:00.873 に答える