2009-06-23 152 views
11

我想创建一个简单的列表框并将SelectAll作为上下文菜单项。但是,似乎ListBox有一些内置的SelectAll处理,我无法工作,但干扰了我尝试实现SelectAll。WPF列表框和全选

我的整个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,则拒绝工作。

我觉得我在对抗列表框,但我不需要。

编辑:看起来我的整个问题都与多选模式有关。如果我将它设置为Extended,那么一切正常,但我不想在扩展模式下使用它。

回答

17

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> 

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

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(); 
})); 
+0

矿山以上XAML没有工作,但后面的代码工作完美的情况下。谢谢 – 2017-07-17 20:09:25