2014-12-29 6 views
1

У меня есть сборка Atelis.Base.Wpf.Resources. Это DLL, которая содержит ресурсные словари.Проблема с созданием вложенных объединенных словарей с использованием SharedResourceDictionary

В рамках этого собрания я определил SharedResourceDictionary:

namespace Atelis.Base.Wpf.Resources 
{ 

/// <summary> 
/// The shared resource dictionary is a specialized resource dictionary 
/// that loads it content only once. If a second instance with the same source 
/// is created, it only merges the resources from the cache. 
/// </summary> 
public class SharedResourceDictionary : ResourceDictionary 
{ 
    /// <summary> 
    /// Internal cache of loaded dictionaries 
    /// </summary> 
    public static Dictionary<Uri, ResourceDictionary> _sharedDictionaries = 
     new Dictionary<Uri, ResourceDictionary>(); 

    /// <summary> 
    /// Local member of the source uri 
    /// </summary> 
    private Uri _sourceUri; 

    /// <summary> 
    /// Gets or sets the uniform resource identifier (URI) to load resources from. 
    /// </summary> 
    public new Uri Source 
    { 
     get { return _sourceUri; } 
     set 
     { 
      try 
      { 
       _sourceUri = new Uri(value.OriginalString); 
      } 
      catch 
      { 
       // do nothing? 
      } 

      if (!_sharedDictionaries.ContainsKey(value)) 
      { 
       // If the dictionary is not yet loaded, load it by setting 
       // the source of the base class 
       base.Source = value; 

       // add it to the cache 
       _sharedDictionaries.Add(value, this); 
      } 
      else 
      { 
       // If the dictionary is already loaded, get it from the cache 
       MergedDictionaries.Add(_sharedDictionaries[value]); 
      } 
     } 
    } 
} 
} 

Я тогда количество ресурсов файлов словарей, как так:

Styles.xaml

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

<!-- styles are defined here --> 
</ResourceDictionary> 

Colors.xaml

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

    <Color x:Key="Color1">#FF000000</Color> 
    <!-- ... many more colors and brushes are defined here --> 
</ResourceDictionary> 

Buttons.xaml

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:Atelis.Base.Wpf.Resources" 
> 
<ResourceDictionary.MergedDictionaries> 
    <local:SharedResourceDictionary Source="pack://application:,,,/Atelis.Base.Wpf.Resources;component/Colors.xaml"/> 
    <local:SharedResourceDictionary Source="pack://application:,,,/Atelis.Base.Wpf.Resources;component/Styles.xaml"/>   
</ResourceDictionary.MergedDictionaries> 

<!-- a ton of button styles are defined here --> 

</ResourceDictionary> 

DataTemplates.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:base="clr-namespace:Atelis.Base.Client;assembly=Atelis.Base.Wpf" 
       xmlns:local="clr-namespace:Atelis.Base.Wpf.Resources" 
       > 

<ResourceDictionary.MergedDictionaries> 
    <local:SharedResourceDictionary Source="pack://application:,,,/Atelis.Base.Wpf.Resources;component/Buttons.xaml"/> 
    <local:SharedResourceDictionary Source="pack://application:,,,/Atelis.Base.Wpf.Resources;component/Colors.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

<!-- a ton of templates are defined here --> 

</ResourceDictionary> 

Все хорошо, пока я не добраться до DataTemplates.xaml. Buttons.xamlSharedResourceDictionary дает мне встроенное предупреждение «Невозможно создать неизвестный тип» {clr-namespace: Atelis.Base.Wpf.Resources} SharedResourceDictionary '. " И когда я пытаюсь определить стиль staticresource, я получаю другое предупреждение xaml «Ресурс« ButtonStyle2 »не может быть разрешен».

Я думаю, важно отметить, что другие SharedResourceDictionary заявления, которые в исходном URI не содержит SharedResourceDictionaries не эта проблема (я могу добавить цвета и стили для деклараций словарных без каких-либо предупреждений и решительность ресурсов при установке) ,

Приложение работает очень хорошо, но я не могу получить визуальную студию для разрешения этого ресурса и удаления предупреждения. Это небольшое неудобство, но мне любопытно узнать, почему это происходит.

ответ

0

Я не уверен, что то, что вы делаете, даже возможно.

AFAIK, здесь два различных метода

<local:Foo x:Key="Bar" /> 

и

<ResourceDictionary Source="Baz" /> 

но твое, как смесь обоих.

Уловка есть, если вы получили «Ресурс« ButtonStyle2 »не может быть разрешен»., убедитесь, что у вас нет других ошибок и попробуйте создать проект. В большинстве случаев мой оператор действителен, но компилятор жалуется на него, пока не создам его в XAML.

Вы также можете объединить эти два типа, упомянутые выше, а также, например, ниже.

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Baz" /> 
    </ResourceDictionary.MergedDictionaries> 
    <local:Foo x:Key="Bar" /> 
</ResourceDictionary>