Как ссылаться на статический ресурс из текущих ресурсов компонента? - PullRequest
2 голосов
/ 25 августа 2010

Вот демонстрация проблемы:

из простого окна:

<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, дает ожидаемый результат, но мой реальный сценарий этого не позволяет.

Итак, что я делаю не так и как получить ожидаемый результат?

ОТВЕТ : после дополнительного тестирования выясняется, что синтаксический анализатор XAML весьма минимален и последовательно анализирует содержимое, не пытаясь ничего интерпретировать Поэтому порядок объявления важен: вы должны поместить ссылку на свойство «Текст» ПОСЛЕ ссылки на словарь. И единственный способ сделать это, кажется, заключить ссылку на StaticResource в элемент «Binding».

Заранее спасибо.

1 Ответ

3 голосов
/ 25 августа 2010

Я думаю, что проблема в том, что когда он пытается найти статический ресурс, он еще не включается в текущий словарь ресурсов ... хотя не уверен.

Делать так, как кажется, работает:

    <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>
...