Кнопки одинакового размера в зависимости от содержимого самой большой кнопки - PullRequest
29 голосов
/ 06 июня 2011

Представьте, что у меня в окне две кнопки WPF со следующим содержимым:

<Button>OK</Button>
<Button>Cancel</Button>

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

Как я могу применить минимальную ширину к этим кнопкам, такую, чтобы ширина самой широкойодин (в зависимости от содержимого) эффективно используется как MinWidth для обоих, таким образом, сохраняя их однородность?

Или, другими словами: я не хочу, чтобы кнопки были шириной их контейнера (разве что использование контейнера умным способом является ответом на мою проблему), и я не хочу, чтобы каждый из них просто изменял размер своего собственного контента, потому что это сделает их разными размерами.Я хочу что-то промежуточное.Тот, у которого самый большой размер контента для отображения его содержимого, а все остальные имеют размер, равный той же ширине, поэтому ширины все равны.

Я ожидаю, что ответ заключается в том, чтобы поместить их в какой-то контейнер.Я знаю, что мог бы использовать Grid и позволить им заполнять ячейки сетки, но дело в том, что я не хочу, чтобы они тоже были слишком в ширину.Я знаю, что мог бы иметь некоторый код позади, который запускается для события Content_Changed кнопок и устанавливает минимальную ширину для ширины самой широкой кнопки, но меня интересует метод чисто-xaml.Возможно, мне нужно создать пользовательский элемент управления, расширяющий ItemsControl, который использует кодовый фрагмент при добавлении или изменении размера новых элементов и применяет ширину самого широкого элемента как MinWidth всех остальных элементов.

Большое спасибо заранее.

Ответы [ 2 ]

22 голосов
/ 06 июня 2011

Сетка

  <Grid HorizontalAlignment="Right" Grid.IsSharedSizeScope="true">
    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="A"/>
        <ColumnDefinition SharedSizeGroup="A"/>
    </Grid.ColumnDefinitions>
    <Grid.Children>
        <Button Grid.Column="0" Content="OK"/>
        <Button Grid.Column="1" Content="Cancel"/>
    </Grid.Children>
  </Grid>

Это можно разбить, вам просто нужно установить IsSharedSizeScope на общего предка, например:

    <StackPanel Grid.IsSharedSizeScope="true">
        <Grid HorizontalAlignment="Right">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="A"/>
            </Grid.ColumnDefinitions>
            <Grid.Children>
                <Button Grid.Column="0" Content="OK"/>
            </Grid.Children>
        </Grid>
        <!-- ... -->
        <Grid HorizontalAlignment="Left">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="A"/>
            </Grid.ColumnDefinitions>
            <Grid.Children>
                <Button Grid.Column="0" Content="Cancel"/>
            </Grid.Children>
        </Grid>
    </StackPanel>

Чтобы кнопки не становились слишком большими, измените HorizontalAlignment Сетки на значение, отличное от Stretch или установите MaxWidth.

13 голосов
/ 06 апреля 2016
Use UniformGrid

<UniformGrid HorizontalAlignment="Right" Rows="1" Columns="2">
  <Button Content="Ok" Grid.Column="0"/>
  <Button Content="Cancel" Grid.Column="1"/>
</UniformGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...