WPF Listbox и выберите все - PullRequest
       16

WPF Listbox и выберите все

12 голосов
/ 23 июня 2009

Я хочу создать простой 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 отказывается работать, если окно списка сфокусировано.

Я чувствую, что борюсь со списком, но мне это не нужно.

Редактировать : Кажется, все мои проблемы связаны с режимом множественного выбора. Если я установлю его на Extended, то все будет работать, однако я не хочу, чтобы он работал в расширенном режиме.

Ответы [ 2 ]

18 голосов
/ 23 июня 2009

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>

Как только связывание клавиш добавлено в ListBox, когда оно имеет фокус, оно теперь направит Ctrl + A обратно к существующей команде SelectAll и SelectAllExecuted.

2 голосов
/ 22 августа 2013

Для таких как я, которые все делают в коде позади :) ...

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
                          new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
    listBox.SelectAll();
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...