有没有办法在WPF中有效地“别名”命令?我的情况是这样的:我创建了一个应用程序,它在具有许多自定义画布的图形编辑器的上下文中使用ApplicationCommands.Delete。这些画布上的一些控件使用TextBoxes,但问题是:TextBox不响应ApplicationCommands.Delete,它响应EditorCommands.Delete。有没有办法干净地让TextBox响应ApplicationCommands.Delete而无需子类化或手动设置每个TextBox实例上的绑定?
答案 0 :(得分:2)
要回答您的具体问题,我知道无法将两个单独的路由命令视为同一命令。但是因为ApplicationCommands.Delete
是一个路由命令,在它被传递到它的目标后,TextBox
并且没有命令绑定,它将开始冒泡。因此,满足您要求的最简单的解决方案是在ApplicationCommands.Delete
到TextBox
之间的某处安装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);
}