我有几个自定义控件,它们共有一些自定义属性,我想应用一个触发这些属性的公共样式。我把这些常见的属性放在一个接口(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}”部分正在使用其余的样式...... 不知道怎么解决这个问题?
答案 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。