Как сохранить неизменными высоту и ширину ячейки сетки

#wpf #grid #height #width #cell

#wpf #сетка #высота #ширина #ячейка

Вопрос:

Мне нужно сохранить Grid высоту ячейки = ширину при изменении размера.

Рабочий код с использованием viewBox:

   <Viewbox>
        <Grid>
            <Grid.RowDefinitions>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="1*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Background="Black" Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"></Label>
                <Label Grid.Row="1" Grid.Column="0" Background="Gray" Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"></Label>
                <Label Grid.Row="0" Grid.Column="1" Background="Gray" Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"></Label>
                <Label Grid.Row="1" Grid.Column="1" Background="Black" Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"></Label>
            </Grid>
        </Viewbox>
  

Спасибо H.B. за идею использовать viewBox ! 🙂

Комментарии:

1. Похоже, вы пропустили код!

2. Вам следует щелкнуть по контуру галочки рядом с ответом Мэтта Уэста, чтобы принять его, поскольку он отвечал на ваш первоначальный вопрос. Также, пожалуйста, избегайте задавать несколько вопросов в одном или преобразовывать свой исходный вопрос во что-то совершенно другое. Если у вас возникли проблемы с обрезкой, найдите SO и если нет ничего, что помогло бы задать новый вопрос только об этой проблеме. (Если, конечно, исправление самого отсечения не считается взломом, и вы на самом деле не хотите лучшего решения , что также подразумевает, что на ваш вопрос фактически не было дано достаточного ответа)

Ответ №1:

«Правильный» способ сделать это, вероятно, использует функции общего размера Grid элемента управления, но это, к сожалению, предотвращает растягивание всей сетки. например

 <Grid Grid.IsSharedSizeScope="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="A"/>
        <ColumnDefinition SharedSizeGroup="A"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition SharedSizeGroup="A"/>
        <RowDefinition SharedSizeGroup="A"/>
    </Grid.RowDefinitions>
    <Label Grid.Row="0" Grid.Column="0" Background="Red"   Content="Lorem"/>
    <Label Grid.Row="1" Grid.Column="0" Background="White" Content="Lorem ipsum"/>
    <Label Grid.Row="0" Grid.Column="1" Background="White" Content="Lorem ipsum dolor"/>
    <Label Grid.Row="1" Grid.Column="1" Background="Red"   Content="Lorem ipsum dolor sit"/>
</Grid>
  

Можно было бы поместить это в Viewbox , но изменение размера этого, вероятно, не то, что вы хотите, поскольку это увеличивает масштаб содержимого. Может быть, вы сможете найти способ сделать это пригодным для использования в вашем контексте.

Ответ №2:

WPF предоставляет UniformGrid — возможно, это окажется более полезным для того, что вы пытаетесь сделать. Вот статья, которая демонстрирует это: http://www.c-sharpcorner.com/UploadFile/yougerthen/308222008124636PM/3.aspx

Чтобы все было правильно, просто привяжите Width свойство grid к его собственному ActualHeight свойству:

 Width="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"
  

Комментарии:

1. За исключением того, что UniformGrid не сохраняет дочерние элементы в форме квадратов при изменении размера.

2. Обновлено для удовлетворения этого требования

3. хм, это сохранит дочерние элементы квадратными (при условии, что вы не установите Columns или Rows ), но это не будет правильно масштабироваться, если высота больше ширины сетки.

Ответ №3:

Я думаю, вместо этого вам следует использовать UniformGrid, или вы можете попробовать что-то вроде:

 <Grid ShowGridLines="True" x:Name="grid" >
  <Grid.RowDefinitions>
    <RowDefinition Height="100" />
    <RowDefinition Height="50" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding ElementName=grid, Path=RowDefinitions[0].Height}" />
    <ColumnDefinition Width="{Binding ElementName=grid, Path=RowDefinitions[1].Height}" />
  </Grid.ColumnDefinitions>
</Grid>
  

Комментарии:

1. Просто чтобы вы знали: в общем, если вы согласны с ответом, который уже дал кто-то другой, вам следует просто дополнить свой ответ, а не повторять его снова.