2009-06-23 14 views
11

Voglio creare un ListBox semplice e selezionare SelectAll come voce del menu di scelta rapida. Tuttavia sembra che ListBox abbia una sorta di gestione integrata per SelectAll che non riesco a lavorare, ma interferisce con il mio tentativo di implementare SelectAll.WPF Listbox e Select All

mio intero XAML è questo:

<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 è semplicemente questo:

private void SelectAllExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    listBox.SelectAll(); 
} 

Ctrl + A funziona se la casella di riepilogo non è a fuoco. L'elemento del menu di scelta rapida funziona correttamente. Ma Control + A rifiuta di funzionare se la listbox è focalizzata.

Mi sento come se stessi combattendo contro la listbox, ma non avrei bisogno di farlo.

Modifica: Sembra che tutto il mio problema riguardi Multiple SelectionMode. Se impostato su Esteso, tutto funziona, tuttavia non lo voglio in modalità estesa.

risposta

17

ListBox sembra avere il proprio comando interno per la combinazione di tasti Ctrl + A, as Marco Zhou explains. Possiamo anche testare questo tentativo tentando di posizionare un punto di interruzione nei gestori Execute e Preview Execute. Come vedrete nessuno dei due viene raggiunto quando il ListBox ha il focus e viene premuta la combinazione di tasti. Anche quando impostiamo SelectionMode su Extended e possiamo vedere gli elementi selezionati dal comando che i gestori non hanno ancora raggiunto. Fortunatamente, possiamo ridefinire un InputGesture esistente semplicemente riassegnandolo. Possiamo farlo nel ListBox per sbarazzarci della sua gestione Ctrl + A personalizzata e riassegnarlo al comando ApplicationCommands.SelectAll.

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

Una volta che il KeyBinding viene aggiunto al ListBox, quando è a fuoco questo si tratta Ctrl + A di nuovo al vostro comando SelectAll esistente e SelectAllExecuted.

1

Per quelli come me che finiscono a fare tutto nel code-behind :) ...

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

in caso di mia sopra XAML non ha funzionato, ma il codice dietro il lavoro perfetto. Grazie –