2011-09-07 46 views
1

我有几个具有常见一些自定义属性的自定义控件,并且我想应用触发这些属性的通用样式。我把这些共同的属性在一个接口(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布尔和背景刷,然后用尝试:

<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,说

无法分配到财产权的ystem.Windows.Setter.Value”

在该行指向: <Setter Property="local:IMyControl.Background" Value="{StaticResource FocusedBG}" />

它与下面的消息的内部异常:

值不能为空。参数名:财产”

值=‘{StaticResource的FocusedBG}’部分是我的风格,其余的工作... 任何想法我怎么能解决这个问题?

回答

0

怎么样,如果你设置的默认值:在风格“本地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

+0

我刚刚尝试过并得到相同的异常。在[msdn:样式和模板](http://msdn.microsoft.com/en-us/library/ms745683.aspx)中说*您可以在任何派生自FrameworkElement或FrameworkContentElement。*的元素上使用样式我猜一个接口不能是一个风格TargetType。必须有其他方式,但我有点失落。不管怎么说,还是要谢谢你。 – CarlosJ

2

安装程序仅在dependency properties上运行,在一个界面中您不能注册它们,并且它们只能被注册一次,所以即使您在界面中为它们指定了一些字段,可能也不是一个好主意。您可能要考虑使用attached properties或使用具有该属性的基类(这可能不是一个选项)。

+0

使用基类不是一种选择,因为每个自定义控件都有它自己的基类,这就是我尝试使用接口的原因。附加属性可以使用bMandatory和bIncomplete来完成,但是如何处理IsKeyboardFocusWithin? – CarlosJ

+0

@CarlosJ:你为什么不使用框架中的现有属性?为什么你甚至有这样的自己的财产? –

+0

我没有自己的属性,我把它放在界面中,所以我可以在样式中使用它,因为每个控件都已经拥有它,但它不起作用。 – CarlosJ

相关问题