Почему Viewbox нарушает макет в сетке с равноудаленными строками/столбцами?

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

person matori82    schedule 14.05.2012    source источник


Ответы (2)


Попробуй это...

     <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>

Строго предполагая, что все кнопки имеют одинаковую высоту.

И по причине, почему это происходит, проверьте это... viewbox" rel="nofollow">http://connect.microsoft.com/VisualStudio/feedback/details/403562/wpf-grid-layout-is-broken-when-put-in-viewbox

person WPF-it    schedule 14.05.2012

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>
person Manuel Gs    schedule 31.10.2017