Вопрос по xaml, wpf, layout – Синхронизация ширины элементов управления WPF в WrapPanel

3

У меня есть этот случай

<code><WrapPanel>
    <CheckBox>Really long name</CheckBox>
    <CheckBox>Short</CheckBox>
    <CheckBox>Longer again</CheckBox>
    <CheckBox>Foo</CheckBox>
    <Slider MinWidth="200" />
</WrapPanel>
</code>

Я хочу, чтобы все флажки внутри WrapPanel были одинаковой ширины.

Добавление следующего почти достигает желаемого эффекта

<code><WrapPanel.Resources>
    <Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
        <Setter Property="MinWidth" Value="75" />
    </Style>
</WrapPanel.Resources>
</code>

Однако я не хочу жестко задавать конкретную ширину, а позволить самому большому CheckBox установить ширину (вышеприведенное также не работает, если есть ширина & gt; 75).

Ползунок независимый и должен быть больше, чем CheckBoxes.

Я не хочу использовать Grid (с IsSharedSizeScope), так как я не хочу иметь жестко закодированное количество столбцов.

Эта статья представляет интересное решение, но было бы неплохо решить проблему без создания пользовательского элемента управления или использования кода C #.

Каков наилучший способ сделать это, желательно только в XAML?

Я удалил свой ответ, так как предположил, что у тебя нет сеток, если первый способ, которым я написал, работает для тебя лучше, то дай мне знать, и я могу отредактировать его. rmoore
Единственное, что я имею против Grid в этом контексте, это то, что я не хочу жестко закодировать количество столбцов, поэтому ваши решения работают отлично. Ваше оригинальное решение тоже было хорошим, немного более повторяющимся, но и более простым. Klas Mellbourn

Ваш Ответ

3   ответа
1

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

8

но столкнулся с препятствиями, заставив его динамически применять к вещам вместо явной упаковки предметов. В этом случае создание AttachedProperty в коде или другом решении, основанном на коде, в конечном итоге может оказаться лучше, чем подход, основанный только на XAML. Однако, чтобы создать чисто XAML-решение, мы можем использовать SharedSizeGroup свойство в ColumnDefinition, чтобы разделить размеры каждого элемента, а затем использовать установить IsSharedSizeScope свойство на WrapPanel. В результате все содержимое в WrapPanel с одной и той же SharedSizeGroup будет иметь общую ширину для столбцов и высоту для строк. Чтобы обернуть ComboBox и, возможно, ComboBox, которые в данный момент отсутствуют в XAML, но будут добавлены в WrapPanel, мы можем создать стиль и повторно создать шаблон ComboBox, чтобы в основном обернуть его сеткой.

<WrapPanel Grid.IsSharedSizeScope="True">
  <WrapPanel.Resources>
    <Style TargetType="{x:Type CheckBox}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type CheckBox}">
            <Grid Background="LightBlue">
              <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="WrapPannelGroup" />
              </Grid.ColumnDefinitions>
              <CheckBox Style="{x:Null}"
                        IsChecked="{TemplateBinding IsChecked}">
                <!--Other TemplateBindings-->
                <CheckBox.Content>
                  <ContentPresenter />
                </CheckBox.Content>
              </CheckBox>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

  </WrapPanel.Resources>
  <CheckBox>Really long name</CheckBox>
  <CheckBox>Short</CheckBox>
  <CheckBox IsChecked="True">Longer again</CheckBox>
  <CheckBox>Foo</CheckBox>
  <Slider MinWidth="200" />
</WrapPanel>

Здесь мы повторно шаблонируем все CheckBox-ы без стиля внутри WrapPannel, чтобы вместо этого быть CheckBoxes, окруженными Grid. Однако из-за этого нам нужно повторно связать все свойства CheckBoxes, которые мы хотим сохранить. Хотя это может стать обременительным, оно также допускает чистый подход XAML.

0

которую вы опубликовали.

Любое решение, с которым вы столкнетесь, будет вынуждено перебирать список элементов и находить максимальную ширину на этапе измерения.

Любой вид ответа только на XAML должен быть предоставлен OOTB (например, IsSharedSizeScope), или использовать какое-то мультисвязывание, чтобы связать элементы вместе. Таким образом, любой ответ XAML будет полон разметки, что делает его более многословным (и менее элегантным).

Единственное изменение, которое я вижу в опубликованной вами статье CodeProject, - это добавление возможности «отключать» рассмотрение определенных элементов (например, вашего слайдера). Это можно сделать как дополнительное прикрепленное свойство.

Похожие вопросы