我想创建一个简单的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();
}
如果列表框不在焦点上,则控制+ A有效。上下文菜单项正常工作。但是如果列表框集中,Control + A就会拒绝工作。
我觉得我正在与列表框作斗争,但我不需要。
编辑:似乎我的整个问题都在于Multiple SelectionMode。如果我将它设置为Extended,那么一切正常,但我不希望它在扩展模式下。
答案 0 :(得分:18)
ListBox似乎有自己的内部命令用于Ctrl + A组合键as Marco Zhou explains。我们还可以通过尝试在Execute和Preview Execute处理程序中放置断点来测试它。当ListBox具有焦点并按下组合键时,您将看不到任何一个。即使我们将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。
答案 1 :(得分:1)
对于那些最喜欢在代码隐藏中做一切的人... ...
listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll,
new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
listBox.SelectAll();
}));