WPF wrappanel: управление горизонтальным и вертикальным поведением

есть ли способ получить этот макет с помощью WPF Wrappanel? B и C на изображениях должны быть выровнены по вертикали в горизонтальном режиме и по горизонтали в вертикальном режиме. Ориентация букв должна быть сохранена. На изображениях от [Горизонтально] до [Вертикально]:

Горизонтальный

Вертикаль

Я пробовал:

<wrappanel>
<A/>
<wrappanel>
<B/><C/>
</wrappanel>
</wrappanel>

но его поведение непредсказуемо. Заранее спасибо.


person michele74c    schedule 14.01.2020    source источник
comment
Есть ли причина не использовать сетку?   -  person Clemens    schedule 14.01.2020
comment
Разве вы не можете просто использовать Grid, установить столбцы и строки и установить columnSpan/rowSpan для A на 2 ?   -  person Zeronader    schedule 14.01.2020
comment
Уникальный способ, который я нашел: добавление кода в событие SizeChanged: if (this.Height > this.Width) {wrappanel.Orientation = Orientation.Horizontal} else {wrappanel.Orientation = Orientation.Vertical}   -  person michele74c    schedule 14.01.2020
comment
@Clemens нет: сетка ограничивает B и C в строках или столбцах.   -  person michele74c    schedule 14.01.2020
comment
@Zeronader проблема не в A, а в B и C.   -  person michele74c    schedule 14.01.2020
comment
Это может быть сетка 2x2 с RowSpan=2 или ColumSpan=2 для A.   -  person Clemens    schedule 14.01.2020
comment
@ michele74c michele74c Итак, ваша проблема заключается в том, как изменить ориентацию при каком-либо условии или просто установить B и C в одинаковое выравнивание?   -  person Zeronader    schedule 14.01.2020
comment
@Clemens, не могли бы вы написать пример? мне непонятно, извините   -  person michele74c    schedule 14.01.2020
comment
@Zeronader да, как управлять свойством ориентации при изменении размера. Кодекс отвечает на этот вопрос. Мне интересно, есть ли способ без кодирования, который использует только макет   -  person michele74c    schedule 14.01.2020
comment
Возможно, вы захотите написать пользовательская панель.   -  person Clemens    schedule 14.01.2020
comment
@Clemens это может быть решением. Даже потому, что макет проекта стал еще сложнее, только сейчас... Спасибо   -  person michele74c    schedule 14.01.2020


Ответы (1)


Если вы просто хотите быть в правильном выравнивании, вы можете просто использовать Grid следующим образом. Таким образом, B и C всегда будут иметь одинаковую ширину и высоту, когда вы изменяете размер окна.

    <Grid>
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" />
      <ColumnDefinition Width="*" />
   </Grid.ColumnDefinitions>
   <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
   </Grid.RowDefinitions>
   <Button Content="A" Grid.Column="0" Grid.RowSpan="2" />
   <Button Content="B" Grid.Column="1" Grid.Row="0"/>
   <Button Content="C" Grid.Column="1" Grid.Row="1"/>
</Grid>
person Zeronader    schedule 14.01.2020
comment
Я пробовал, но этот код всегда выдает левую верхнюю кнопку и две правые. Однако изменение размера не приводит к отображению ссылки... - person michele74c; 14.01.2020
comment
О, так вы хотите изменить размер с горизонтального на вертикальный? Вы должны быть более четкими в своих вопросах. Вы также можете попробовать использовать панель обертки, но оставьте B и C в сетке и установите минимальную ширину для сетки или A, поэтому 2-й элемент (который будет сеткой) переместится во 2-ю строку в wrapPanel. - person Zeronader; 14.01.2020
comment
если вы используете сетку или что-то еще, первая панель обтекания будет обертывать содержащуюся в ней сетку, но содержащиеся объекты не будут обертываться от горизонтального к вертикальному, как на изображении. Вторая обертка должна решить эту проблему, но... вот в чем вопрос. Я не знаю, как лучше объяснить, извините - person michele74c; 14.01.2020
comment
Итак, сейчас я не могу найти никакого решения без кода, но с помощью небольшого кода вы можете сделать конвертер, который преобразует ширину всего окна или элемента управления A в ориентацию и устанавливает ее на 2nd wrapPanel. - person Zeronader; 14.01.2020