【问题标题】:How do I access an element inside a style programmatically?如何以编程方式访问样式中的元素?
【发布时间】:2011-11-22 18:53:05
【问题描述】:

我在下面有一个 WPF 按钮样式:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Width="{Binding Width}" Height="{Binding Height}">
                    <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}">
                        <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/>
                    </Border>
                    <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="overlay" Property="Opacity" Value="0.6" />
                        <Setter TargetName="overlay" Property="Background" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

问题是,尽管我的应用程序的所有按钮都具有相同的样式,但其中一些需要在其周围设置边框。因此我想知道是否可以访问我的样式的容器边框来设置其厚度和颜色?如果是这样,我该怎么做?

编辑:

我混合了 madd0 和 Josh 的建议,并在我的样式中创建了一个 DataTrigger,并绑定到一个属性,告诉我按钮是否应该有边框。

最终代码如下:

<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Width="{Binding Width}" Height="{Binding Height}">
                    <Border Name="container" Background="{Binding Background}" CornerRadius="{Binding CornerRadius}">
                        <TextBlock Margin="10" FontFamily="Arial" FontWeight="Bold" TextAlignment="Left" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" FontSize="{Binding TextSize}" Foreground="White" Text="{Binding Text}" TextWrapping="Wrap"/>
                    </Border>
                    <Border Name="overlay" Background="Transparent" CornerRadius="{Binding CornerRadius}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=HasBorder}" Value="true">
                        <Setter TargetName="container" Property="BorderThickness" Value="{Binding BorderThickness}" />
                        <Setter TargetName="container" Property="BorderBrush" Value="{Binding BorderBrush}" />
                    </DataTrigger>

                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="overlay" Property="Opacity" Value="0.6" />
                        <Setter TargetName="overlay" Property="Background" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

感谢大家的帮助, 科米格

【问题讨论】:

  • 是什么决定了边框是否应该出现?如果您使用触发器进行这样的更改会更干净

标签: c# wpf coding-style


【解决方案1】:

我认为如果你扩展 Button 类并给它一个新的布尔 DependencyProperty,基本上你需要做的就是给你的 Border 一个名称,然后在 ControlTemplate.Triggers 中,触发该布尔属性以根据需要制作边框在你的特殊情况下。

这与您已经拥有的 IsPressed ControlTemplate 触发器类似。

【讨论】:

  • 您好,谢谢您的回答。是否可以使用数据绑定中的属性来执行此操作?这种方式而不是实例化类,我只需在 DataContext 类中创建一个属性。这个属性也有 DependencyProperty 吗?
  • 是的,您应该能够通过使用RelativeSource绑定到您的DataContext到托管您的按钮的窗口或用户控件,然后在属性前面加上DataContext。,即。 DataContext.TheProperty。不,您的 DataContext 中的该属性不需要是依赖属性,但如果值更改,则需要 NotifyPropertyChanged。
【解决方案2】:

我不认为您真的需要访问您的控件模板属性。由于Button 已经有边框属性,你应该直接在按钮上设置这些属性。然后,将边框添加到您的ControlTemplate,将其属性绑定到按钮的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2020-06-11
    • 2014-12-09
    相关资源
    最近更新 更多