【问题标题】:Assign a property value outside of the static resource file在静态资源文件之外分配一个属性值
【发布时间】:2020-05-29 20:08:09
【问题描述】:

我不知道我是否正确地表达了这个问题,但这是我的问题。 我在屏幕上有 3 个按钮。每个按钮都使用来自静态资源文件的相同MyButtonStyle。所有 3 个按钮的行为方式相同,但我希望每个按钮的边框具有不同的 CornerRadius 属性。由于 Button 本身没有 CornerRadius 属性,因此我不能像对背景和画笔那样使用TemplateBinding。我可以扩展基本样式以创建 3 个单独的样式,但我想尝试这样做。
这是我的代码:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Name="border" 
                        BorderThickness="2" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        Background="{TemplateBinding Background}" 
                        CornerRadius = something >

                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

所以问题是,我究竟应该将什么作为 CornerRadius 的值,以便能够从代码或 Window XAML 文件中为每个对象单独修改它?
我的目标是这样的,虽然我不确定它是否可行:

<Button x:Name="Button1"
        Width="240"
        Height="150"
        Style="{StaticResource MyButtonStyle}"
        BoundNameForCornerRadius="10"/>

【问题讨论】:

标签: wpf xaml controltemplate wpf-style


【解决方案1】:

如果您没有将属性Tag 用于其他目的,您可以通过将样式中的CornerRadius 绑定到按钮的Tag 属性来找到一个简单的解决方案:

        <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" 
                            BorderThickness="2" 
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            Background="{TemplateBinding Background}" 
                            CornerRadius = "{Binding Path=Tag,
    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}}" >

                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Button x:Name="Button1"
                    Width="240"
                    Height="150"
                    Style="{StaticResource MyButtonStyle}"
                    Tag="10"/>   <!-- set CornerRadius to 10-->

        <Button x:Name="Button2"
                    Width="240"
                    Height="150"
                    Style="{StaticResource MyButtonStyle}"
                    Tag="30"/> <!-- set CornerRadius to 30 -->

我承认此解决方案无助于使代码/样式更清晰/可读,但它很容易并且可以完成工作。

【讨论】:

  • 它可以工作,虽然直到现在我还没有听说过 Tag 属性。感谢您的意见:)
  • 不客气,我2天前才听说这件事,谢谢这里的人:)
  • 对不起,我当时忘记了,给你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多