Я нашел решение, которое работает и во время разработки (по крайней мере, в VS2010):
public static class Resource
{
private static readonly Dictionary<Uri, ResourceDictionary> SharedDictinaries = new Dictionary<Uri, ResourceDictionary>();
private static void onMergedDictionaryChanged(DependencyObject source, DependencyPropertyChangedEventArgs args)
{
FrameworkElement el = source as FrameworkElement;
if (el == null)
return;
Uri resourceLocator = new Uri(GetMergedDictionary(source), UriKind.Relative);
ResourceDictionary dictionary;
if (SharedDictinaries.ContainsKey(resourceLocator))
dictionary = SharedDictinaries[resourceLocator];
else
{
dictionary = (ResourceDictionary)Application.LoadComponent(resourceLocator);
SharedDictinaries.Add(resourceLocator, dictionary);
}
el.Resources.MergedDictionaries.Add(dictionary);
}
public static readonly DependencyProperty MergedDictionaryProperty =
DependencyProperty.RegisterAttached("MergedDictionary", typeof (String), typeof (Resource), new FrameworkPropertyMetadata(null, onMergedDictionaryChanged));
[AttachedPropertyBrowsableForType(typeof(FrameworkElement))]
public static String GetMergedDictionary(DependencyObject source)
{
return (String) source.GetValue(MergedDictionaryProperty);
}
public static void SetMergedDictionary(DependencyObject source, String value)
{
source.SetValue(MergedDictionaryProperty, value);
}
}
Это присоединенное свойство может быть применено к FrameworkElement. Представьте, что customLabelStyle определен в словаре Styles.xaml в проекте Edu.Wpf.Example. Таким образом, этот стиль может быть применен следующим образом:
<UserControl x:Class="Edu.Wpf.Example.UserControlA"
...
xmlns:res="clr-namespace:Edu.Wpf.Example.Resources"
res:Resource.MergedDictionary="/Edu.Wpf.Example;component/Resources/Styles.xaml">
...
<Label Style="{StaticResource customLabelStyle}"/>
</UserControl>