繁体   English   中英

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

[英]How do I access an element inside a style programmatically?

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

我认为,如果您扩展Button类并为其提供一个新的布尔DependencyProperty,则本质上您需要做的就是给您的Border命名,然后在ControlTemplate.Triggers中触发该布尔属性以根据需要在您的边框中创建边框特别案例。

这将与IsPressed ControlTemplate触发器所具有的相似。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM