You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF自定义LedControl:ColorWhenOn/Off属性未生效问题求助

WPF LedControl自定义颜色不生效的解决方案

问题核心是控件模板未正确绑定自定义的ColorWhenOn和ColorWhenOff依赖属性,导致切换IsOn状态时仍使用硬编码的默认颜色。以下是修复步骤:

1. 确认依赖属性定义正确性

检查LedControl.cs中依赖属性的注册是否规范,确保属性可被模板绑定访问:

public class LedControl : Control
{
    static LedControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(LedControl), 
            new FrameworkPropertyMetadata(typeof(LedControl)));
    }

    // IsOn状态属性
    public bool IsOn
    {
        get => (bool)GetValue(IsOnProperty);
        set => SetValue(IsOnProperty, value);
    }

    public static readonly DependencyProperty IsOnProperty =
        DependencyProperty.Register(nameof(IsOn), typeof(bool), typeof(LedControl), 
            new PropertyMetadata(false));

    // 开启状态颜色属性
    public Color ColorWhenOn
    {
        get => (Color)GetValue(ColorWhenOnProperty);
        set => SetValue(ColorWhenOnProperty, value);
    }

    public static readonly DependencyProperty ColorWhenOnProperty =
        DependencyProperty.Register(nameof(ColorWhenOn), typeof(Color), typeof(LedControl), 
            new PropertyMetadata(Colors.Green));

    // 关闭状态颜色属性
    public Color ColorWhenOff
    {
        get => (Color)GetValue(ColorWhenOffProperty);
        set => SetValue(ColorWhenOffProperty, value);
    }

    public static readonly DependencyProperty ColorWhenOffProperty =
        DependencyProperty.Register(nameof(ColorWhenOff), typeof(Color), typeof(LedControl), 
            new PropertyMetadata(Colors.Gray));
}

2. 修改Generic.xaml控件模板

将模板中硬编码的颜色替换为绑定到控件的自定义属性,使用TemplateBinding实现模板与控件属性的关联:

<Style TargetType="{x:Type local:LedControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:LedControl}">
                <Ellipse x:Name="LedEllipse">
                    <Ellipse.Fill>
                        <RadialGradientBrush Center="0.3,0.3" RadiusX="0.7" RadiusY="0.7">
                            <GradientStop Color="{TemplateBinding ColorWhenOff}" Offset="0.2"/>
                            <GradientStop Color="{TemplateBinding ColorWhenOff}" Offset="1"/>
                        </RadialGradientBrush>
                    </Ellipse.Fill>
                </Ellipse>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsOn" Value="True">
                        <Setter TargetName="LedEllipse" Property="Fill">
                            <Setter.Value>
                                <RadialGradientBrush Center="0.3,0.3" RadiusX="0.7" RadiusY="0.7">
                                    <GradientStop Color="{TemplateBinding ColorWhenOn}" Offset="0.2"/>
                                    <GradientStop Color="{TemplateBinding ColorWhenOn}" Offset="1"/>
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

3. 验证测试项目的使用方式

确保测试项目中正确绑定IsOn属性并设置自定义颜色:

<StackPanel>
    <CheckBox x:Name="LedToggle" Content="切换LED状态"/>
    <myns:LedControl Width="50" Height="50"
                     IsOn="{Binding IsChecked, ElementName=LedToggle}"
                     ColorWhenOn="Aqua" ColorWhenOff="Black"/>
</StackPanel>

常见错误排查

  • 依赖属性注册时PropertyMetadata的owner类型错误,导致属性无法被模板识别
  • 控件模板中未使用绑定,仍保留硬编码的Green/Gray颜色值
  • 触发器的Property或TargetName设置错误,无法触发颜色切换
  • 测试项目未正确引用控件所在的命名空间(myns)

内容的提问来源于stack exchange,提问作者R.A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:34:50