我想创建一个简单的ListBox并将SelectAll作为上下文菜单项。但是,似乎ListBox具有对SelectAll的某种内置处理,我无法使用它,但正在干扰我实现SelectAll的尝试。
我的整个XAML是这样的:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.SelectAll"
Executed="SelectAllExecuted" />
</Window.CommandBindings>
<DockPanel>
<CheckBox DockPanel.Dock="Top">My Checkbox</CheckBox>
<ListBox Name="listBox" SelectionMode="Multiple">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Command="ApplicationCommands.SelectAll" />
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
</DockPanel>
</Window>
SelectAllExecuted就是这样:
private void SelectAllExecuted(object sender, ExecutedRoutedEventArgs e)
{
listBox.SelectAll();
}
如果列表框没有对准焦点,则Control + A起作用。上下文菜单项可以正常工作。但是,如果列表框处于焦点状态,则Control + A拒绝工作。
我觉得我正在与列表框作战,但我不需要这样做。
编辑:似乎我的整个问题都与Multiple SelectionMode。如果将其设置为“扩展”,则一切正常,但是我不希望它处于扩展模式。
最佳答案
ListBox似乎有它自己的Ctrl + A组合键as Marco Zhou explains内部命令。我们还可以通过尝试在Execute和Preview Execute处理程序中放置一个断点来进行测试。如您所见,当列表框具有焦点并按下组合键时,都不会到达。即使将SelectionMode设置为Extended,我们也可以看到该命令选择的项目,但仍未到达处理程序。值得庆幸的是,我们可以通过重新分配现有的InputGesture来覆盖它。我们可以在ListBox中执行此操作以摆脱其自定义Ctrl + A处理,然后将其重新分配给ApplicationCommands.SelectAll命令。
<ListBox Name="listBox"
SelectionMode="Multiple">
<ListBox.InputBindings>
<KeyBinding Command="ApplicationCommands.SelectAll"
Modifiers="Ctrl"
Key="A" />
</ListBox.InputBindings>
...
</ListBox>
将KeyBinding添加到ListBox之后,当它具有焦点时,它将立即将Ctrl + A路由回到您现有的SelectAll命令和SelectAllExecuted。