为什么我的命令绑定仅在按钮位于工具栏中时才有效?

时间:2012-12-19 17:40:59

标签: wpf xaml routed-commands

我有一个带有工具栏的窗口,其中包含一些带命令的按钮。 由于我用包含按钮的堆栈面替换了工具栏,因此按钮停止工作。

根据我的理解,这种情况没有任何区别。按钮仍然具有Command属性设置,我没有更改我的自定义命令类中的任何内容,并且CommandBinding也仍然相同。它们实现了比按钮更深的一些网格和用户控件,但只要按钮位于ToolBar控件中它们就可以工作!

如果我直接在他们工作的Window中实现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 个答案:

答案 0 :(得分:2)

好吧,我想再次被我自己想出来了(为什么这总是在我发布问题后才发生?)

简短:我需要在FocusManager.IsFocusScope="true"

上设置StackPanel

长:看看这个问题的答案:Do I have to use CommandTarget? I thought any focused element would receive the Command

答案 1 :(得分:0)

StackPanel只会将子元素排列成一条可以水平或垂直定向的行。

虽然Toolbar为一组命令或控件提供了容器。

如果将StackPanel元素放在ToolBar

中会发生什么
<ToolBar>
    <StackPanel>
        <Button Command="gui:GuiCommands.Hello">Hello</Button>
    </StackPanel>
</ToolBar>