2009-11-20 122 views
0

为什么下面的XAML会导致堆栈溢出异常与一些主题?WPF样式导致循环

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="ExpressionLight.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
      <Setter Property="Margin" Value="5"/> 
     </Style> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/> 
    </ResourceDictionary> 
</Application.Resources> 

我已经尝试了在互联网上发现的几个主题,其中约一半导致异常。

是否有另一种方法将默认名称为Style

编辑:

的问题是,Theme添加默认样式的资源字典(名称为System.Windows.Control.Button的条目)。由于字典只能包含每个键的单个条目,因此无法在同一资源字典中添加新的默认值。

不知道为什么会导致“stackoverflow”而不是“重复键”异常。这可能是因为可以包含重复键的合并字典的特殊处理。

的解决方案是应用命名Style默认代码:

void AppStartup(object sender, StartupEventArgs args) { 
    this.Resources[typeof(Button)] = this.Resources["BaseButtonStyle"]; 
    .... 
} 

由于BaseButtonStyle被staticly绑定到它当然不可能在运行时使用此解决方案来改变主题的主题。

回答

2

您有在此代码循环依赖:

<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
    <Setter Property="Margin" Value="5"/> 
</Style> 

这种风格说这是TargetType的按钮,多数民众赞成罚款。 它也说它是BasedOn为TargetType Button定义的样式,这是它本身。 更好地将键分配给以前的样式,然后在BasedOn中使用该键。

编辑:

通过您的代码会后再次似乎有自己的风格,并在ExpressionLight.xaml定义的样式之间的循环引用。解决方法是将资源置于不同的级别。

<Window.Resources> 
<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="ExpressionLight.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <Grid.Resources> 
    <Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
     <Setter Property="Margin" Value="5"/> 
    </Style> 
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/> 
    </Grid.Resources> 
    ............ 
    ........... 
    ........... 
</Grid> 
+0

对不起,但我不明白。在这种情况下什么是“以前的风格”? – adrianm 2009-11-21 06:25:58

+0

仍然不明白。你能告诉我如何创建一个扩展主题风格的命名风格?然后使命名样式为默认。 – adrianm 2009-11-21 14:11:11

+0

我再次检查了您的代码,然后为您编辑了我的答案,您可以检查答案中的“编辑”部分。 – viky 2009-11-21 15:57:22