Подтвердить что ты не робот

Динамическая компоновка WPF: как применять квадратные пропорции (ширина равна высоте)?

Я изучаю WPF и не могу понять, как заставить мои кнопки принимать квадратную форму.

Вот мой XAML Markup:

<Window x:Class="Example"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="368" Width="333">
  <Window.Resources>
    <Style x:Key="ToggleStyle" BasedOn="{StaticResource {x:Type ToggleButton}}"
                            TargetType="{x:Type RadioButton}">
    </Style>
  </Window.Resources>
  <RadioButton Style="{StaticResource ToggleStyle}">
        Very very long text
  </RadioButton>
</Window>

Задание явных значений для атрибутов Width и Height кажется неправильной идеей - кнопка должна автоматически вычислять свои размеры на основе ее содержимого, но сохранить их ширину и высоту. Возможно ли это?

4b9b3361

Ответ 1

Попробуйте это - он работает в Kaxaml:

<Button 
    MinWidth="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" 
    MinHeight="{Binding ActualWidth, RelativeSource={RelativeSource Self}}">
  Some content
</Button>

(Чтобы проверить, я помещаю TextBox внутри кнопки, потому что это простой способ изменить размер содержимого без повторного анализа Xaml.)

Изменить: извините, вероятно, должен был указать его как стиль, соответствующий вашему примеру:

<Style TargetType="Button" x:Key="SquareButton">
  <Setter Property="MinWidth" Value="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" />
  <Setter Property="MinHeight" Value="{Binding ActualWidth, RelativeSource={RelativeSource Self}}" />
</Style>

Ответ 2

Я думаю, вы хотите привязать ширину кнопки к ее высоте, например:

<Button Name="myButton"
Width="{Binding ElementName=myButton, Path=Height}"
Height="100">
Button Text
</Button>

Ответ 3

В настоящее время принятый ответ не может расти и уменьшаться. Я думаю, что нашел лучший подход, определив собственный стиль с помощью прямоangularьника (растянутого равномерно).

<Style x:Key="SquareButton" TargetType="Button">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="#3a3a3a" />
    <Setter Property="BorderBrush" Value="#5a5a5a"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">

                <Border HorizontalAlignment="Center">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="auto"/>
                        </Grid.ColumnDefinitions>
                        <Rectangle Stretch="Uniform"
                                         Stroke="{TemplateBinding BorderBrush}"
                                         StrokeThickness="4"
                                         Margin="0" 
                                         Fill="{TemplateBinding Background}" 
                                         Panel.ZIndex="1"
                                         />
                        <ContentPresenter Margin="10" 
                           HorizontalAlignment="Center" 
                           VerticalAlignment="Center" 
                           Panel.ZIndex="2" />
                    </Grid>
                    </Border>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="#4a4a4a"/>
        </Trigger>
    </Style.Triggers>
</Style>

Кстати, вы также можете создать идеальную круглую кнопку таким образом. Просто замените Rectangle на Ellipse.

Ответ 4

Ответ @Dan Pruzey был хорош, но не уменьшал площадь, если окно было уменьшено. Что я нашел лучше всего, так это установил высоту на авто и ширину на эту высоту:

<Button Height="Auto" Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>

Это удерживало кнопку в квадрате, когда размер моего окна становился все больше и меньше. Надеюсь, это кому-нибудь поможет.