WPF:Button不会改变它的Grid.Column

时间:2014-01-03 23:16:56

标签: c# wpf xaml menu grid

我想创建一个菜单,右侧有一个按钮,左侧有一个按钮。在菜单的中心,我想要一个MenuItem。到目前为止,除了要放在GridColumn 2中的Button_forward之外,一切都有效。无论我尝试什么,Button都保留在GridColumn 0中。我可以在GridColumn 2中显示除Button之外的所有内容。

这应该看起来像是

+ ------------------------------------ +
|按钮| MenuItem |按钮|
+ ------------------------------------ +

<Menu DockPanel.Dock="Bottom" Height="30" Background="Gainsboro" HorizontalAlignment="Stretch">
    <Menu.ItemsPanel>
         <ItemsPanelTemplate>
                <Grid ShowGridLines="True" x:Name="Grid1">        
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                </Grid>
        </ItemsPanelTemplate>
    </Menu.ItemsPanel>
    <Button Height="20"  Width="40" Grid.Column="0" x:Name="Button_backward"     Click="Button_backward_Click" IsEnabled="False">
        <Image Source="..\Resources\leftarrow.png"/>
    </Button>

    <MenuItem Grid.Column="1" Height="20" >
         <TextBox Text="Test"></TextBox>
    </MenuItem>
    <Button Grid.Column="2" Height="20"  Width="40" x:Name="Button_forward" Click="Button_forward_Click" IsEnabled="False">
        <Image Source="..\Resources\rightarrow.png"/>
    </Button>
    </Menu>

如果我将Button放在MenuItem中,它会在第2列中正确显示

    <MenuItem Grid.Column="2">
        <Button Height="20"  Width="40" x:Name="Button_forward" Click="Button_forward_Click" IsEnabled="False">
            <Image Source="..\Resources\rightarrow.png"/>
        </Button>
    </MenuItem>    

如何在第二列中显示按钮?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是可以理解的,

Menu控件的工作方式是,如果您不提供MenuItem并直接提供类似Button的内容,则会将Button包裹在MenuItem中1}}内部(因此,Grid.ColumnButton的{​​{1}}规范就菜单的ItemsPanel而言毫无用处。“

您可以使用Snoop检查此行为,例如:

正如您所看到的,Button包含在MenuItem中,并且由于它没有指定Grid.Column,因此默认情况下会将其置于第0列,从而为您提供问题。

<强>解决方案:

正如您所猜测的那样,将Button包裹在MenuItem中(从而在定义中给出相应的列,系统稍后不会更改)

MenuItem设置为与Button类似,并直接使用它。

使用不同的布局控件,例如StackPanel或不强加此要求的排序