WPF动态布局:如何强制平方比例(宽度等于高度)?

Gar*_*art 35 wpf xaml

我正在学习WPF,无法弄清楚我的按钮是如何形成方形的.

这是我的XAML标记:

<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>
Run Code Online (Sandbox Code Playgroud)

为属性WidthHeight属性指定显式值似乎是一个错误的想法 - 按钮应根据其内容自动计算其尺寸,但保持其宽度和高度相等.这可能吗?

Dan*_*zey 48

试试这个 - 它似乎适用于Kaxaml:

<Button 
    MinWidth="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" 
    MinHeight="{Binding ActualWidth, RelativeSource={RelativeSource Self}}">
  Some content
</Button>
Run Code Online (Sandbox Code Playgroud)

(为了测试,我在按钮内部放置了一个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>
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案的唯一问题是控件可以增长,但不能缩小。因此,如果将窗口调整为更大的尺寸,则控件将变大,但是当窗口缩小时,控件将保持更大的尺寸。 (2认同)

yva*_*den 5

当前接受的答案不能增长和缩小。我想我找到了一个更好的方法,通过使用矩形(均匀拉伸)定义自定义样式。

<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>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您也可以通过这种方式创建一个完美的圆形按钮。只需用椭圆替换矩形。