【问题标题】:How to explicitly declare <StaticResource/> in ResourceDictionary? [duplicate]如何在 ResourceDictionary 中显式声明 <StaticResource/>? [复制]
【发布时间】:2016-12-09 16:39:25
【问题描述】:

我正在尝试在 &lt;Style.Resources&gt; 元素内显式声明一个 StaticResource,但是当我尝试运行应用程序时出现此错误:

无法将“System.Windows.Media.Effects.DropShadowEffect”类型的对象转换为“System.Windows.ResourceDictionary”类型。

以下是相关代码:

<DropShadowEffect x:Key="Sombra" Opacity="0.5" ShadowDepth="3" BlurRadius="5"/>

<Style x:Key="BotãoNavegaçãoBase" TargetType="{x:Type ButtonBase}" BasedOn="{StaticResource BotãoGeometria}">
    <Style.Resources>
        <StaticResource x:Key="PathShadow" ResourceKey="Sombra"/>
    </Style.Resources>      
</Style>

如果按照错误消息提示,我将 &lt;StaticResource/&gt; 包装在 ResourceDictionary 中,我会收到“缺少密钥”错误:

    <Style.Resources>
        <ResourceDictionary>
            <StaticResource x:Key="PathShadow" ResourceKey="Sombra"/>
        </ResourceDictionary>
    </Style.Resources>

“StaticResourceHolder”对象缺少键值。

【问题讨论】:

  • 这不是StaticResource 的用途。 @ChrisW。在我仍在为资源的多次使用测试相同的确切答案时发布了他的答案。工作正常。如果您需要创建同一资源的多个实例,&lt;sys:Double x:Key="ProfundidadeDeSombra"&gt;3&lt;/sys:Double&gt; &lt;DropShadowEffect x:Key="Sombra" Opacity="{StaticResource ProfundidadeDeSombra}" ... 等。
  • @EdPlunkett 我在 SO 中看到了很多关于这个问题的答案,我非常有信心理解它,并且我上面的代码应该可以正常运行。我向您转发我仍然有同样的问题:为什么我会在运行时收到异常,而大多数人抱怨这主要是设计时问题?有什么想法吗?
  • @EdPlunkett,您还提到“这不是 StaticResource 的用途”。你到底是什么意思?也就是说,我的示例的哪一部分不是 StaticResource 的用途是什么?您可以在my former question 中对我的意图有更广泛的了解
  • 我指的是使用StaticResource 将现有资源插入另一个ResourceDictionary。我从来没有这样做过。
  • 你能告诉我其他人用&lt;StaticResource ...做同样事情的例子吗?我也无法让它工作。

标签: wpf xaml resourcedictionary staticresource


【解决方案1】:

您已经很接近了,但是您在示例中尝试做的是为 Effect 的属性提供资源,其中您的 DropShadowEffect StaticResource 已经。

你真正想做的是这个;

<DropShadowEffect x:Key="Sombra" Opacity="0.5" ShadowDepth="3" BlurRadius="5"/>

<Style x:Key="BotãoNavegaçãoBase" TargetType="{x:Type ButtonBase}" 
       BasedOn="{StaticResource BotãoGeometria}">
    <Setter Property="Effect" Value="{StaticResource Sombra}"/>     
</Style>

或者如果你真的希望它嵌入到实例中,这个;

<Style x:Key="BotãoNavegaçãoBase" TargetType="{x:Type ButtonBase}" 
       BasedOn="{StaticResource BotãoGeometria}">
    <Style.Resources>
       <DropShadowEffect x:Key="Sombra" Opacity="0.5" ShadowDepth="3" BlurRadius="5"/>
    </Style.Resources>
    <Setter Property="Effect" Value="{StaticResource Sombra}"/>     
</Style>

希望这会有所帮助,干杯。

【讨论】:

  • 嗯,不完全是。我试图在使用模板的样式中声明一个静态资源。该模板有一个 DynamicResource。我希望 each 样式使用它来让 DynamicResourceKey 评估为不同的 StaticResource。完全可以在我的previous question看到
  • 我尝试了你的第二种方法,它奏效了!尽管如此,仍然存在两个问题:1)我已经看到了我最初在其他预计它们可以工作的 SO 帖子中使用的语法; 2)如果我要在不止一种风格中使用相同的阴影效果,我仍然希望有一个静态资源,它只是“分流”到上面定义的另一个,比如this。我的疑问是:为什么我以前的语法不起作用?为什么我得到了异常?
  • 真的吗?我根本不希望它起作用?我的意思是您实际上是在尝试使用其全部目的是提供属性值的东西,并且显然希望它神奇地继承到甚至没有指定开头的依赖属性?或者来自文档...Provides a value for any XAML property attribute by looking up a reference to an already defined resource. 但是,如果我在评论中阅读您的示例,“分流”是指您想要像他们对颜色一样进行一些资源链接吗?
  • 是的,我认为“链接”是一个更好的词。我的印象是他们只是想以这种方式创建别名。通过这样做,我可以期待一个 DynamicResource,例如 MagicKey 作为 ResourceKey,然后在本地“注入”任何已经具有自己的语义密钥的资源,但用所需的别名密钥“标记”它(MagicKey)在这种情况下)而不是到处重新声明相同的资源,我希望通过MagicKey动态资源键来查找它的值。 (呸,那是一口……)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2019-10-01
  • 2011-05-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多