Почему мои командные привязки работают только если кнопка находится на панели инструментов?
У меня есть окно с панелью инструментов, которая содержит несколько кнопок с командами. Кнопки перестали работать, так как я заменил панель инструментов панелью стека, содержащей кнопки.
В моем понимании это не имеет никакого значения. У кнопок по-прежнему установлено свойство 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>