如何从当前组件资源引用静态资源?

时间:2010-08-25 15:30:56

标签: wpf staticresource

这是一个问题的演示:

从一个简单的窗口:

<Window x:Class="TestWpfStaticResource.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<TextBlock Text="{StaticResource TestString}">
    <TextBlock.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </TextBlock.Resources>
</TextBlock>

我正在尝试访问ResourceDictionary中的资源:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="TestString">Test</sys:String>
</ResourceDictionary>

Visual Studio 2010显示了具有预期结果的窗口,但在运行应用程序时,我获得了此异常:

Cannot find resource named 'TestString'. Resource names are case sensitive.

注1:使用DynamicResource时,VS 2010和运行时的结果都很好。

注意2:将对资源字典的引用放在TextBlock之外,例如在Windows资源中,给出了预期的结果,但我的真实场景不允许这样做。

那么,我做错了什么以及如何获得预期结果?

ANSWER :经过更多测试后,似乎XAML解析器非常小,并按顺序解析内容,而不尝试解释任何内容。 因此声明顺序很重要:您必须在对字典的引用之后引用“Text”属性。 并且唯一的方法似乎是在“Binding”元素中包含对StaticResource的引用。

提前致谢。

1 个答案:

答案 0 :(得分:3)

我认为问题在于,当它试图找到静态资源时,它尚未合并到当前资源字典中......但不确定。

这样做似乎有效:

    <TextBlock>
        <TextBlock.Resources>    
            <ResourceDictionary>
                 <ResourceDictionary.MergedDictionaries>
                       <ResourceDictionary Source="Resources.xaml"></ResourceDictionary>
                 </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
       </TextBlock.Resources>

        <TextBlock.Text>
            <Binding  Source="{StaticResource TestString}" />
        </TextBlock.Text>           
    </TextBlock>