2017-03-18 15 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: Làm thế nào tôi có thể thay đổi nguồn gốc của một ResourceDictionary cụ

Làm thế nào tôi có thể thay đổi nguồn gốc của một ResourceDictionary cụ thể bên trong ResourceDictionary.MergedDictionaries dựa trên ResourceDictionary 's x:Name/x:Uid?

Cảm ơn.

Trả lời

2

Tôi không nghĩ rằng bạn có thể làm điều đó dựa trên x:Name hoặc x:Uid. ResourceDictionary không xác định ánh xạ cho các thuộc tính đánh dấu đó. Ví dụ: UIElement được đánh dấu bằng UidPropertyAttribute("Uid") và do đó UIElement được đánh dấu bằng thuộc tính x:Uid sẽ có giá trị đó có sẵn là Uid thuộc tính. Cùng câu chuyện với x:Name. Nhưng ResourceDictionary không xác định ánh xạ như vậy, và vì vậy các thuộc tính đó bị mất hiệu quả sau khi xaml được phân tích cú pháp và biên dịch.

Bây giờ, bạn có thể làm gì thay thế? Một tùy chọn mà bạn nghĩ đến là sử dụng thuộc tính đính kèm của riêng bạn để gán từ điển tài nguyên một mã định danh. Thật không may, ResourceDictionary không được kế thừa từ DependencyObject và do đó chúng tôi không thể sử dụng các thuộc tính được đính kèm trên đó.

Tuy nhiên, có một bản hack mà chúng tôi có thể lạm dụng cú pháp thuộc tính đính kèm và vẫn đạt được mục tiêu. Hãy xác định thuộc tính đính kèm giả như sau:

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

Lưu ý rằng định nghĩa này khác với thuộc tính được đính kèm thông thường. Đầu tiên, không có tài sản đính kèm nào cả. Thứ hai, hai phương pháp GetNameSetName không chấp nhận DependencyObject (giống như các phương pháp được liên kết với thuộc tính đính kèm), nhưng ResourceDictionary. Tuy nhiên, bởi vì chúng tôi có GetNameSetName phương pháp - chúng ta có thể sử dụng kèm theo cú pháp tài sản, như thế này:

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

Mặc dù đối tượng mục tiêu (ResourceDictionary) không phải là sự phụ thuộc đối tượng, và tài sản mà không kèm theo bất động sản ở tất cả.

Bây giờ thật dễ dàng để thay đổi nguồn gốc của từ điển mục tiêu:

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

Đây là lần đầu tiên của tôi đối phó với các từ điển nguồn XAML để Im khá tránh khỏi thất bại. Dù sao, cảm ơn sự giúp đỡ của bạn !! –

Các vấn đề liên quan