为什么以下XAML会导致具有某些主题的堆栈溢出异常?
<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的条目)中。由于字典只能包含每个键的一个条目,因此不可能在同一资源字典中添加新的默认值。
不知道它为什么会导致“堆栈溢出”而不是“重复键”异常。这可能是因为合并字典的特殊处理,这些字典可以包含重复的键。
解决方案是将命名的Style作为默认代码应用于代码中:
void AppStartup(object sender, StartupEventArgs args) {
this.Resources[typeof(Button)] = this.Resources["BaseButtonStyle"];
....
}由于BaseButtonStyle是静态绑定到主题的,因此当然不可能使用此解决方案在运行时更改主题。
发布于 2009-11-21 01:32:49
在此代码中具有循环依赖关系:
<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>https://stackoverflow.com/questions/1773755
复制相似问题