Почему мои командные привязки работают только если кнопка находится на панели инструментов?

У меня есть окно с панелью инструментов, которая содержит несколько кнопок с командами. Кнопки перестали работать, так как я заменил панель инструментов панелью стека, содержащей кнопки.

В моем понимании это не имеет никакого значения. У кнопок по-прежнему установлено свойство Command, я ничего не изменил в своем классе пользовательских команд, и CommandBinding также остается прежним. В них реализованы некоторые сетки и пользовательский контроль глубже, чем кнопка, но они работают, пока кнопки находятся в элементе управления ToolBar!

Если я реализую CommandBindings непосредственно в окне, они работают (но это не то, что я хочу)

Вот код (сокращенно):

<Window>
    <Grid>
        <StackPanel>
            <Button Command="gui:GuiCommands.Hello">Hello</Button>
        </StackPanel>

        <Grid>
            <TabControl>
                <TabItem Header="MyTab">
                    <Grid>
                        <Grid.CommandBindings>
                            <CommandBinding Command="gui:GuiCommands.Hello" Executed="hello_Clicked"/> <!-- THIS WOULD NOT WORK -->
                        </Grid.CommandBindings>
                    <Grid>
                </TabItem>
            </TabControl>
        </Grid>
    </Grid>

    <Window.CommandBindings>
        <CommandBinding Command="gui:GuiCommands.Hello" Executed="hello_Clicked"/> <!-- THIS WOULD WORK -->
    </Window.CommandBindings>
</Window>

Я знаю, что это не скомпилируется, но я должен был упростить это. Это работает, как только я заменяю "StackPanel" на "ToolBar" с моим приложением. Как это может быть?

2 ответа

Решение

Ладно, думаю, я снова понял это (почему это всегда происходит сразу после того, как я отправил вопрос?)

Коротко: мне нужно было установить FocusManager.IsFocusScope="true" на StackPanel

Долго: см. Ответ на этот вопрос: Должен ли я использовать CommandTarget? Я думал, что любой сфокусированный элемент получит Команду

StackPanel размещает дочерние элементы только в одну строку, которая может быть ориентирована горизонтально или вертикально.

В то время как панель инструментов предоставляет контейнер для группы команд или элементов управления.

Так что же произойдет, если вы поместите элемент StackPanel внутри панели инструментов

<ToolBar>
    <StackPanel>
        <Button Command="gui:GuiCommands.Hello">Hello</Button>
    </StackPanel>
</ToolBar>
Другие вопросы по тегам