2010-08-25 2 views
2

здесь является демонстрацией проблемы:Как ссылаться на статический ресурс из текущих ресурсов компонента?

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

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

Визуальных Studio 2010 показывает мое окно с ожидаемым результатом, но при запуске приложения я получаю это исключение:

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

Примечание 1: при использовании DynamicResource результат будет прекрасным в VS 2010 и во время выполнения.

Примечание 2: размещение ссылки на словарь ресурсов за пределами TextBlock, в Windows Resources, например, дает ожидаемый результат, но мой реальный сценарий этого не позволяет.

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

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

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

ответ

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> 
+0

Спасибо за ваш ответ. Действительно, это работает так, поэтому теперь у нас есть обходное решение, но вопрос о том, что именно происходит в моем первоначальном вопросе, остается. – Pragmateek

+0

Хорошо, после большего тестирования кажется, что парсер выполняет очень минимальную работу. Я добавлю ответ на эту тему. – Pragmateek

+0

Я обновил исходный вопрос более подробно. Еще раз спасибо за полезный ответ. – Pragmateek

Смежные вопросы