15

単純なリストボックスを作成し、コンテキストメニュー項目として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は機能しません。

リストボックスと戦っているような気がしますが、そうする必要はありません。

編集:私の全体の問題はMultipleSelectionModeにあるようです。拡張に設定すると、すべてが機能しますが、拡張モードにはしたくありません。

4

2 に答える 2

19

Marco Zhouが説明しているように、ListBoxにはCtrl+Aキーの組み合わせに対する独自の内部コマンドがあるようです。ExecuteハンドラーとPreviewExecuteハンドラーにブレークポイントを設定して、これをテストすることもできます。ご覧のとおり、リストボックスにフォーカスがあり、キーの組み合わせが押された場合、どちらにも到達しません。SelectionModeをExtendedに設定し、コマンドによってアイテムが選択されていることを確認しても、ハンドラーに到達していません。ありがたいことに、既存のInputGestureを再割り当てするだけで、オーバーライドできます。リストボックスでこれを実行して、カスタムのCtrl + A処理を取り除き、ApplicationCommands.SelectAllコマンドに再割り当てできます。

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

KeyBindingがリストボックスに追加されると、フォーカスがあるときに、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 に答える