首页 > 解决方案 > 如何定义查看属性值的样式

问题描述

因此,我为切换按钮定义了样式,该样式在按下切换按钮时设置背景颜色。

<Style x:Key="ToggleStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Border CornerRadius="10" Margin="5,5,5,5" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"
                        Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="Background" Value="DarkGray"/>
        </Trigger>
    </Style.Triggers>
</Style>

这可行,但我真正想做的是让这种样式设置不同的颜色,基于我可以在 XAML 中为切换按钮定义的属性。

这甚至可能吗?如果是这样,如何去做呢?

- 所以在下面采取了 Eric 的回答并且它起作用了,但现在我发现自己想要在每个实例的基础上修改背景和前景。

我尝试了以下方法:

    public static class ToggleButtonAttach
{
    private static readonly DependencyProperty CheckedBackgroundProperty = DependencyProperty.RegisterAttached("CheckedBackground", typeof(Brush), typeof(ToggleButtonAttach));
    public static void SetCheckedBackground(ToggleButton target, Brush value) => target.SetValue(CheckedBackgroundProperty, value);
    public static Brush GetCheckedBackground(ToggleButton target) => (Brush)target.GetValue(CheckedBackgroundProperty);

    private static readonly DependencyProperty CheckedForegroundProperty = DependencyProperty.RegisterAttached("CheckedForeground", typeof(Brush), typeof(ToggleButtonAttach));
    public static void SetCheckedForeground(ToggleButton target, Brush value) => target.SetValue(CheckedForegroundProperty, value);
    public static Brush GetCheckedForeground(ToggleButton target) => (Brush)target.GetValue(CheckedForegroundProperty);

}


       <Style x:Key="ToggleStyle" TargetType="{x:Type ToggleButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Border x:Name="border" Focusable="False" CornerRadius="10" Margin="5,5,5,5" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"
                            Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                        <ContentPresenter x:Name="toggleButtonContentPresenter" TextElement.Foreground="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="TextElement.Foreground" TargetName="toggleButtonContentPresenter" Value="{Binding Path=(piapp:ToggleButtonAttach.CheckedForeground), RelativeSource={RelativeSource TemplatedParent}}"/>
                            <Setter TargetName="border" Property="Background" Value="{Binding Path=(piapp:ToggleButtonAttach.CheckedBackground), RelativeSource={RelativeSource TemplatedParent}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
         </Style>

但我收到以下错误:“成员“CheckedForeground”无法识别或无法访问。

显然出了点问题,但我没有看到。

标签: c#wpf

解决方案


听起来您想要一个带有附加依赖属性的自定义控件。来自文章:

public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(MyCode)
    );

public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}

然后,您的控件模板可以将各种元素及其颜色属性绑定到您各自的依赖项属性。


推荐阅读