0

在 Windows 应用商店应用程序中,我无法通过 StaticResource 绑定将一个资源字典中的资源用作第二个资源字典样式中的属性设置器的值。

这是我正在尝试做的一个例子:

Dictionary1.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="SomeBrush" Color="Black" />
</ResourceDictionary>

Dictionary2.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="SomeStyle" TargetType="Button">
        <Setter Property="Foreground" Value="{StaticResource SomeBrush}" />
    </Style>
</ResourceDictionary>

应用程序.xaml

<Application
    x:Class="TestApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Common/StandardStyles.xaml"/>
                <ResourceDictionary Source="Common/Dictionary1.xaml"/>
                <ResourceDictionary Source="Common/Dictionary2.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

无论我做什么,这都行不通。该应用程序不会启动,而是抛出一个未处理的异常,其效果是“无法找到具有键 'SomeBrush' 的资源”。

我尝试更改 App.xaml 中的顺序,使用嵌套合并字典等。

已经设法通过这样做让它工作,但这不是一个选择:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Dictionary1.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <Style x:Key="SomeStyle" TargetType="Button">
        <Setter Property="Foreground" Value="{StaticResource SomeBrush}" />
    </Style>
</ResourceDictionary>

在运行时,App.Resources.MergedDictionaries 被清除,并且根据各种条件动态加载各种资源字典。Dictionary1.xaml 和 Dictionary2.xaml 都是相互独立加载的,并且根据这些条件可能包含不同的资源,因此不能以这种方式合并它们。它们必须在设计时包含在 App.xaml 中以支持....设计。

有谁知道这里发生了什么?这是一个错误吗?

谢谢!

4

2 回答 2

0

我相信我理解这里发生的事情,我将尝试解释我的观点,希望它会有所意义。

据我所知,在玩弄并能够复制您所看到的问题之后,在我看来,使用StaticResource关键字意味着它所指的键需要在 ResourceDictionary 的“范围”中可用。

这可以解释为什么您的第二次尝试有效,因为您已与 合并Dictionary1.xamlDictionary2.xaml因此SomeBrush可以被视为“在范围内”并且它会起作用。

显然,在第一种情况下,定义的键Dictionary1.xaml被认为是“超出范围” Dictionary2.xaml。但这将被视为该应用程序的“范围内”。

我的很多内容都是基于我所观察到的,但我还在 MSDN 上的ResourceDictionary 和 XAML 资源引用页面中找到了以下句子:

在 ResourceDictionary 的范围内,检查字典的键唯一性。但是,该范围不会扩展到 MergedDictionaries 中的不同项目。

于 2013-08-28T22:51:11.923 回答
0

我今天在通用应用程序项目中遇到了类似的问题。问题是,合并的字典需要带有-protocol的Source-path 。ms-appx

<ResourceDictionary Source="ms-appx:///Common/StandardStyles.xaml"/>
...

它是否解决了您的问题?

于 2015-04-02T20:23:31.623 回答