有没有办法在WPF中使用别名命令?

时间:2011-02-23 22:17:16

标签: wpf routed-commands

有没有办法在WPF中有效地“别名”命令?我的情况是这样的:我创建了一个应用程序,它在具有许多自定义画布的图形编辑器的上下文中使用ApplicationCommands.Delete。这些画布上的一些控件使用TextBoxes,但问题是:TextBox不响应ApplicationCommands.Delete,它响应EditorCommands.Delete。有没有办法干净地让TextBox响应ApplicationCommands.Delete而无需子类化或手动设置每个TextBox实例上的绑定?

1 个答案:

答案 0 :(得分:2)

要回答您的具体问题,我知道无法将两个单独的路由命令视为同一命令。但是因为ApplicationCommands.Delete是一个路由命令,在它被传递到它的目标后,TextBox并且没有命令绑定,它将开始冒泡。因此,满足您要求的最简单的解决方案是在ApplicationCommands.DeleteTextBox之间的某处安装Window的命令绑定,以实现您想要的行为。

这是一个在父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);
}