具有相同自定义属性的不同控件的常用样式

时间:2011-09-07 08:08:55

标签: wpf xaml styles custom-controls

我有几个自定义控件,它们共有一些自定义属性,我想应用一个触发这些属性的公共样式。我把这些常见的属性放在一个接口(IMyControl)中,并使我的控​​件实现它,但似乎一个样式不能有一个接口作为TargetType ...

我的自定义属性是两个布尔值:bMandatory和bIncomplete。常见的风格部分是:

<Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
        <Setter Property="Background" Value="{StaticResource FocusedBG}" />
    </Trigger>
    <Trigger Property="bMandatory" Value="True">
        <Setter Property="Background" Value="{StaticResource MandatoryBG}" />
    </Trigger>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="bMandatory" Value="True" />
            <Condition Property="bIncomplete" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" Value="{StaticResource IncompleteBG}" />
    </MultiTrigger>
</Style.Triggers>

我还在界面中添加了 IsKeyboardFocusWithin bool和背景画笔,然后尝试使用:

<Style x:Key="ControlRellenableEstilo">
    <Style.Triggers>
        <Trigger Property="local:IMyControl.IsKeyboardFocusWithin" Value="True">
            <Setter Property="local:IMyControl.Background" Value="{StaticResource FocusedBG}" />
        </Trigger>
        <Trigger Property="local:IMyControl.bMandatory" Value="True">
            <Setter Property="local:IMyControl.Background" Value="{StaticResource MandatoryBG}" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="local:IMyControl.bMandatory" Value="True" />
                <Condition Property="local:IMyControl.bIncomplete" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{StaticResource IncompleteBG}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>

构建时不会抱怨,但是当执行应用程序时,它会抛出一个XamlParseException,表示

  

无法分配属性'System.Windows.Setter.Value'

指着这条线:    <Setter Property="local:IMyControl.Background" Value="{StaticResource FocusedBG}" />

它有一个内部异常,并带有以下消息:

  

值不能为空。参数名称:property'

Value =“{StaticResource FocusedBG}”部分正在使用其余的样式...... 不知道怎么解决这个问题?

2 个答案:

答案 0 :(得分:2)

Setters只在dependency properties上运行,在一个你无法注册它们的界面中,它们只能注册一次,所以即使你在界面中为它们指定了一些可能远非好主意的字段。您可能需要考虑使用attached properties或使用具有该属性的基类(可能不是一个选项)。

答案 1 :(得分:0)

如果你在Style中设置'local:IMyControl.Background'的默认值怎么样,如:

<Style x:Key="ControlRellenableEstilo">

    <Setter Property="local:IMyControl.Background" Value="Gray" /> 
    <!--or use TemplateBinding to Parent to get suitable color-->

    <Style.Triggers>

        ... skipped ...

    </Style.Triggers>
</Style>

同时检查CustomControl上的Precedence List