2011-04-15 34 views
11

我有一个主题应用于资源字典中的所有按钮。现在我想在按钮上添加一个触发器,同时继承字典中的样式更改。我试了下面的代码:在资源字典中以另一种样式为基础创建样式

但它说,控制无法找到。 我该如何解决它?

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 

     <conv:ErrorContentConverter x:Key="ErrorContentConverter" /> 

     <Style x:Key="ValidTrigger" 
      TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
       <Setter Property="IsEnabled" Value="false" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </ResourceDictionary> 
</UserControl.Resources> 

和基本模板:

<Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
    <Setter Property="FocusVisualStyle" 
      Value="{DynamicResource NuclearButtonFocusVisual}" /> 
    <Setter Property="Foreground" Value="#FF042271" /> 
    <Setter Property="FontFamily" Value="Trebuchet MS" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Padding" Value="3" /> 

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" /> 
</Style> 

回答

12

给你的基本样式的名称,说FooStyle。

在你给的例子,修改和的TargetType以支持算法FMP如下所示:

<Style x:Key="ValidTrigger" 
     TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" > 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
      <Setter Property="IsEnabled" Value="false" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

我可以不分配名称吗?词典中只有一种控制风格。 – Marcom 2011-04-15 10:03:37

+0

您的意思是说,您不希望将扩展样式指定为基准样式,而是根据它的TargetType找出要扩展的样式?我不知道。 – 2011-04-15 10:21:29

+0

为什么你犹豫给基础风格一个x:Key =“FooStyle”? – 2011-04-15 10:26:53

0

StaticResource vs DynamicResource

你想用DynamicResource,而不是静态资源的。您的应用程序将进行编译,并且资源将在运行时而不是编译时解析。过去,DynamicResource在旧的WPF时代会有更多的性能成本,但现在看来它并不是问题。我的意思是,嘿,Expression Blend是用WPF编写的,并且全部使用DynamicResources。


P.S.请记住,如果您没有真正定义资源名称,那么您的应用程序仍会运行,但在您的情况下,您将缺少功能。 :)

+0

看来,这不能做到,我试过了,但我发现DynamicRecource只能用于依赖属性。 – Zmaster 2011-08-01 20:13:07

1

我认为没有基础风格定义为“控制”,所以你的 BasedOn="{StaticResource {x:Type Control}}"部分将无法找到任何东西。

你可能想改变

<Style x:Key="ValidTrigger" TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 

<Style x:Key="ValidTrigger" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" > 
10

一招我在过去使用:在你的ResourceDictionary定义毯款式供您的应用程序,添加一个x:Key到风格,你想继承,如下所示:

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 
    <!-- your style here --> 
</Style> 

要应用th是风格为指定的类型(Button在这个例子中)的所有控件,而无需显式地设置每ButtonStyle属性,添加另一个风格是BasedOn这种风格,但没有一键:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" /> 

使用这种方法,应用程序中的所有Button都将自动继承您的自定义样式,但您仍然可以创建其他样式BasedOn条目并避免吹走所有自定义样式。

相关问题