如何以编程方式访问样式中的元素?

时间:2011-11-22 18:53:05

标签: c# wpf coding-style

我在下面有一个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>

谢谢大家的帮助, Komyg

2 个答案:

答案 0 :(得分:1)

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

它类似于你已经使用IsPressed ControlTemplate触发器。

答案 1 :(得分:0)

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