首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF样式引起循环

问WPF样式引起循环
EN

Stack Overflow用户
提问于 2009-11-20 23:01:15
回答 1查看 965关注 0票数 0

为什么以下XAML会导致具有某些主题的堆栈溢出异常?

代码语言:javascript
复制
<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作为默认代码应用于代码中:

代码语言:javascript
复制
void AppStartup(object sender, StartupEventArgs args) {
    this.Resources[typeof(Button)] = this.Resources["BaseButtonStyle"];
    ....
}

由于BaseButtonStyle是静态绑定到主题的,因此当然不可能使用此解决方案在运行时更改主题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-21 01:32:49

在此代码中具有循环依赖关系:

代码语言:javascript
复制
<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中定义的样式之间似乎存在一个循环引用。解决办法是将资源放在不同的级别上。

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1773755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档