为什么Viewbox在Grid中打破具有等间距行/列的布局?

时间:2012-05-14 02:16:15

标签: wpf grid viewbox

简单地说,我有一个Grid,有三个同样高的行和两个按钮。我想在第一行中有第一个按钮,然后第二行为空,最后在第三行中有第二个按钮。这样我就得到了相对大小的按钮之间的间距。我需要这个而不是硬编码绝对边际值。所以这是XAML:

                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <Button Grid.Row="0">Button 1</Button>
                    <Button Grid.Row="2">Button 2</Button>
                </Grid>

效果很好!现在我需要的其他功能是让所有内容都可以扩展,所以我把它放在Viewbox中:

            <Viewbox>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <Button Grid.Row="0">Button 1</Button>
                    <Button Grid.Row="2">Button 2</Button>
                </Grid>
            </Viewbox>

突然布局被打破了。我得到了Viewbox提供的缩放,但我没有得到按钮之间的空白空间。所以有两个问题:

  1. 为什么Viewbox会破坏这里的内容?
  2. 我该如何解决这个问题?我需要灵活性,所以想象一下,我可以拥有任意数量的按钮,这些按钮可以在网格中由任意数量的空行/列分隔。

2 个答案:

答案 0 :(得分:0)

试试这个......

     <Viewbox>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition 
                        MinHeight="{Binding Path=ActualHeight,
                                   ElementName=MyButton1}"
                        Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Button Grid.Row="0" x:Name="MyButton1">Button 1</Button>
            <Button Grid.Row="2">Button 2</Button>
        </Grid>
    </Viewbox>

严格假设按钮的高度相同。

为什么会发生这种情况,请检查此... http://connect.microsoft.com/VisualStudio/feedback/details/403562/wpf-grid-layout-is-broken-when-put-in-viewbox

答案 1 :(得分:0)

Viewbox无法与百分比一起使用。在我看来,我不建议使用Viewbox来“分组”所有元素。您应该仅使用Viewbox作为按钮文本:

<Window.Resources>
    <Style x:Key="DefaultButton" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Background="LightGray">
                        <Viewbox>
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Viewbox>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <Border>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="0.3*" />
                <RowDefinition Height="0.3*" />
                <RowDefinition Height="0.3*" />
            </Grid.RowDefinitions>
            <Button Grid.Row="0" Style="{DynamicResource DefaultButton}">Button 1</Button>
            <Button Grid.Row="2" Style="{DynamicResource DefaultButton}">Button 2</Button>
        </Grid>
    </Border>
</Grid>