2017-03-18 3 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: Wie kann ich die Quelle einer spezifischen Resource ändern

Wie kann ich die Quelle eines bestimmten ResourceDictionary innerhalb ResourceDictionary.MergedDictionaries auf die ResourceDictionary ‚s x:Name/x:Uid basierend ändern?

Danke.

Antwort

2

Ich glaube nicht, dass Sie das basierend auf x:Name oder x:Uid tun können. ResourceDictionary definiert keine Zuordnungen für diese Markupeigenschaften. Zum Beispiel ist UIElement mit UidPropertyAttribute("Uid") markiert und so UIElement markiert mit x:Uid Attribut wird diesen Wert als Uid Eigenschaft haben. Gleiche Geschichte mit x:Name. Aber ResourceDictionary definiert solche Zuordnungen nicht, und so gehen diese Eigenschaften effektiv verloren, nachdem XAML geparst und kompiliert wurde.

Nun, was können Sie stattdessen tun? Eine Option, die Ihnen einfällt, ist die Verwendung Ihrer eigenen angehängten Eigenschaft, um dem Ressourcenwörterbuch eine Kennung zuzuweisen. Leider erbt ResourceDictionary nicht von DependencyObject und daher können wir keine angehängten Eigenschaften verwenden.

Es gibt jedoch einen Hack, mit dem wir die Syntax der angehängten Eigenschaft missbrauchen und trotzdem das Ziel erreichen können. Lassen Sie uns fälschlicherweise angefügte Eigenschaft wie folgt definieren:

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]; 
    } 
} 

Beachten Sie, dass diese Definition von der üblichen angefügten Eigenschaft unterscheidet. Erstens, es gibt überhaupt kein angebundenes Eigentum. Zweitens, zwei Methoden GetName und SetName akzeptieren nicht DependencyObject (wie Methoden mit angefügten Eigenschaften tun), aber ResourceDictionary. Da wir jedoch GetName und SetName Methoden haben - können wir angefügten Eigenschaft Syntax verwenden, wie folgt aus:

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

Obwohl Zielobjekt (ResourceDictionary) nicht Abhängigkeitsobjekt, und diese Eigenschaft ist nicht verbunden Eigenschaft.

Jetzt ist es einfach Quelle Zielwörterbuch zu ändern:

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

Dies ist mein erstes Mal den Umgang mit XAML-Ressourcen Wörterbücher so Im ziemlich ahnungslos. Wie auch immer, danke für Ihre Hilfe !! –

Verwandte Themen