WPF列表框和全选(WPF Listbox and Select All)

2019-06-23 21:57发布

我想创建一个简单的列表框,并有全选的上下文菜单项。 然而似乎列表已某种内在的处理为全选,我不能获得工作,但我试图实现全选的干扰。

我的整个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工作,如果列表框没有焦点。 上下文菜单项正常工作。 但控制+ A拒绝,如果列表框的重点工作。

我觉得像我对抗的列表框,但我不应该需要。

编辑 :看来我的整个问题是与多的SelectionMode。 如果我把它设置为扩展,然后一切正常,但我不希望它在扩展模式。

Answer 1:

列表框似乎有按Ctrl + A组合键它自己的内部命令, 马可·周解释说 。 我们也可以通过尝试将在执行和预览执行的处理程序断点进行测试。 正如你将看到没有达到时,列表框具有焦点并按下组合键。 即使我们将SelectionMode来扩展,我们可以看的项目由处理器仍然没有达到命令选择。 值得庆幸的是,虽然,我们可以通过刚刚重新分配它覆盖现有InputGesture。 我们可以在列表框摆脱它这样做的自定义Ctrl + A键处理,然后将其重新分配给ApplicationCommands.SelectAll命令。

<ListBox Name="listBox"
         SelectionMode="Multiple">
    <ListBox.InputBindings>
        <KeyBinding Command="ApplicationCommands.SelectAll"
                    Modifiers="Ctrl"
                    Key="A" />
    </ListBox.InputBindings>            
    ...
</ListBox>

一旦键绑定添加到列表框,当它具有焦点它将现在的路线Ctrl + A键返回到您现有的选命令和SelectAllExecuted。



Answer 2:

对于那些像我这样谁拉闸在后台代码:)做的一切......

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
                          new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
    listBox.SelectAll();
}));


文章来源: WPF Listbox and Select All