15

我想创建一个简单的 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 将拒绝工作。

我觉得我正在与列表框作斗争,但我不应该这样做。

编辑:似乎我的全部问题都与多重选择模式有关。如果我将它设置为扩展,那么一切正常,但是我不希望它处于扩展模式。

4

2 回答 2

19

正如 Marco Zhou 解释的那样,ListBox 似乎有它自己的 Ctrl+A 组合键的内部命令。我们还可以通过尝试在 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。

于 2009-06-23T07:28:55.113 回答
3

对于像我这样最终在代码隐藏中做所有事情的人:) ...

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
                          new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
    listBox.SelectAll();
}));
于 2013-08-22T04:02:07.647 回答