2017-03-18 6 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

के स्रोत को बदल सकते हैं मैं एक विशिष्ट ResourceDictionaryResourceDictionary.MergedDictionaries अंदर का स्रोत ResourceDictionary के x:Name/x:Uid के आधार पर कैसे बदल सकता हूँ?

धन्यवाद।

उत्तर

2

मुझे नहीं लगता कि आप x:Name या x:Uid पर आधारित कर सकते हैं। ResourceDictionary उन मार्कअप गुणों के लिए मैपिंग को परिभाषित नहीं करता है। उदाहरण के लिए, UIElementUidPropertyAttribute("Uid") के साथ चिह्नित है और विशेषता के साथ UIElement चिह्नित किया गया है, यह मान Uid संपत्ति के रूप में उपलब्ध होगा। x:Name के साथ वही कहानी। लेकिन ResourceDictionary इस तरह के मैपिंग को परिभाषित नहीं करता है, और इसलिए एक्सएमएल को पार्स और संकलित करने के बाद उन गुणों को प्रभावी ढंग से खो दिया जाता है।

अब, आप इसके बजाय क्या कर सकते हैं? एक विकल्प जो दिमाग में आता है वह संसाधन शब्दकोश को पहचानने के लिए अपनी संलग्न संपत्ति का उपयोग करना है। दुर्भाग्यवश, ResourceDictionaryDependencyObject से प्राप्त नहीं है, और इसलिए हम उस पर संलग्न गुणों का उपयोग नहीं कर सकते हैं।

हालांकि, एक हैक है जिसके साथ हम संलग्न संपत्ति वाक्यविन्यास का दुरुपयोग कर सकते हैं और अभी भी लक्ष्य तक पहुंच सकते हैं। आइए नकली संलग्न संपत्ति को इस तरह परिभाषित करें:

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

ध्यान दें कि यह परिभाषा सामान्य संलग्न संपत्ति से अलग है। सबसे पहले, कोई संलग्न संपत्ति नहीं है। दूसरा, दो विधियों GetName और SetNameDependencyObject (संलग्न गुणों से जुड़े तरीकों की तरह) स्वीकार नहीं करते हैं, लेकिन ResourceDictionary। साथ ही, हम GetName और SetName तरीकों है - हम संपत्ति वाक्य रचना संलग्न उपयोग कर सकते हैं, इस तरह:

<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 संसाधनों शब्दकोशों तो इम बहुत जानकारी नहीं के साथ काम कर रहा है:

अब यह लक्ष्य शब्दकोश के स्रोत को संशोधित करने के लिए आसान है। वैसे भी, आपकी मदद के लिए धन्यवाद !! –