【问题标题】:WPF ControlTemplate set rounded button radius equal to half of its widthWPF ControlTemplate 设置圆形按钮半径等于其宽度的一半
【发布时间】:2021-04-20 14:51:57
【问题描述】:

我想使用 ControlTemplate 创建一个圆形按钮。这是我的代码,当我的宽度和高度等于 30 时它可以完美运行。我知道,是否可以将 RadiusX 和 RadiusY 设置为按钮 Width 的一半(例如 RadiusX={Width/2}) ?

        <ControlTemplate x:Key="RoundButton" TargetType="Button">
            <Grid>
                <Rectangle RadiusX="15" RadiusY="15"
                           Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
                           Fill="{TemplateBinding Background}" />
                <ContentPresenter Margin="3"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Grid>
        </ControlTemplate>

【问题讨论】:

  • 绑定到ActualWidth。如果您不能使用原始值,但需要一些公式,那么您可能只需要一个转换器 (example)。

标签: c# wpf wpf-controls


【解决方案1】:
    <ControlTemplate x:Key="RoundButton" TargetType="Button">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid x:Name="PART_Grid" Visibility="Hidden"/>
            <Rectangle Grid.ColumnSpan="2"
                       RadiusX="{Binding ActualWidth, ElementName=PART_Grid, Mode=OneWay}"
                       RadiusY="{Binding ActualWidth, ElementName=PART_Grid, Mode=OneWay}"
                       Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
                       Fill="{TemplateBinding Background}" />
            <ContentPresenter Grid.ColumnSpan="2" Margin="3"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Grid>
    </ControlTemplate>

Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" - - 恕我直言,这是多余的。 最好删除。

【讨论】:

  • 你好@EldHasp,绑定模式参数(Mode=OneWay)是强制性的吗?当我删除它时没有什么不同。
  • 我通过 Binding Designer 添加了绑定,Visual Studio 自己插入了这个模式,因为 ActualWidth 属性是“ReadOnly”。在这种情况下,这个确实可以省略,但在其他情况下,如果不为“ReadOnly”属性指定Mode = OneWay,则可能会出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多