2017-03-18 58 views
5
<Application x:Class="CDesign.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:CDesign" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 
    <ResourceDictionary x:Name="ThemeDictionary"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/AppStyles;component/Resources/Icons.xaml"/> 
      <ResourceDictionary Source="pack://application:,,,/AppStyles;component/Resources/IconsNonShared.xaml"/> 
      <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! --> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
      <!-- Accent and AppTheme setting --> 
      <ResourceDictionary x:Uid="Accents" x:Name="Accents" Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
      <ResourceDictionary x:Uid="BaseTheme" x:Name="BaseTheme" Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseDark.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

XAML:我怎样才能改变一个特定的ResourceDictionary

的来源如何更改内部ResourceDictionary.MergedDictionaries特定ResourceDictionary的基础上,ResourceDictionaryx:Name/x:Uid来源是什么?

谢谢。

回答

2

我不认为你可以这样做基于x:Namex:UidResourceDictionary未定义这些标记属性的映射。例如,UIElementUidPropertyAttribute("Uid")标记,因此UIElement标记为x:Uid属性将具有该值可用作Uid属性。与x:Name同样的故事。但ResourceDictionary没有定义这样的映射,所以在分析和编译xaml之后,这些属性会被有效地丢失。

现在,你可以做些什么呢?想到的一个选择是使用您自己的附属属性为资源字典分配标识符。不幸的是,ResourceDictionary不会从DependencyObject继承,所以我们无法在其上使用附加属性。

但是,我们可以滥用附加属性语法并仍然达到目标。让我们来定义这样的伪附加属性:

public static class ResourceDictionaryExtensions { 
    private static readonly Dictionary<ResourceDictionary, string> _mapping = new Dictionary<ResourceDictionary, string>(); 
    public static void SetName(ResourceDictionary element, string value) { 
     _mapping[element] = value; 
    } 

    public static string GetName(ResourceDictionary element) { 
     if (!_mapping.ContainsKey(element)) 
      return null; 
     return _mapping[element]; 
    } 
} 

请注意,此定义与通常的附加属性不同。首先,根本没有附属财产。其次,两种方法GetNameSetName不接受DependencyObject(如与附属属性相关的方法),但ResourceDictionary。但是,因为我们有GetNameSetName方法 - 我们可以使用附加属性语法,就像这样:

<Application.Resources> 
    <ResourceDictionary x:Name="ThemeDictionary"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/AppStyles;component/Resources/Icons.xaml"/> 
      <ResourceDictionary Source="pack://application:,,,/AppStyles;component/Resources/IconsNonShared.xaml"/> 
      <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! --> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
      <!-- Accent and AppTheme setting --> 
      <ResourceDictionary local:ResourceDictionaryExtensions.Name="Accents" Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
      <ResourceDictionary local:ResourceDictionaryExtensions.Name="BaseTheme" Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseDark.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

即使目标对象(ResourceDictionary)是不依赖对象,并且该属性没有附加属性的。

现在很容易修改目标字典来源:

var dict = Application.Current.Resources.MergedDictionaries.First(c => ResourceDictionaryExtensions.GetName(c) == "Accents"); 
dict.Source = new Uri("path to the new dictionary"); 
+0

这是我第一次处理XAML资源字典所以Im相当无知。 无论如何,感谢您的帮助! –