У меня есть сборка 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.xaml
SharedResourceDictionary
дает мне встроенное предупреждение «Невозможно создать неизвестный тип» {clr-namespace: Atelis.Base.Wpf.Resources} SharedResourceDictionary '. " И когда я пытаюсь определить стиль staticresource
, я получаю другое предупреждение xaml «Ресурс« ButtonStyle2 »не может быть разрешен».
Я думаю, важно отметить, что другие SharedResourceDictionary
заявления, которые в исходном URI не содержит SharedResourceDictionaries
не эта проблема (я могу добавить цвета и стили для деклараций словарных без каких-либо предупреждений и решительность ресурсов при установке) ,
Приложение работает очень хорошо, но я не могу получить визуальную студию для разрешения этого ресурса и удаления предупреждения. Это небольшое неудобство, но мне любопытно узнать, почему это происходит.