2016-11-14 15 views
5

Tôi đang sử dụng từ điển tài nguyên (cùng một từ điển) trong nhiều trình biến đổi dưới dạng biến cục bộ.Cách sử dụng Resource Dictionary hiệu quả trong mọi phần của dự án

var DeignerDictionary = new ResourceDictionary 
{ 
    Source = new Uri(path) 
}; 

Mỗi lần tôi tạo một phiên bản mới và bộ nhớ rất cao trong ứng dụng.

Sau đó, tôi đã chuyển từ điển tài nguyên sang trường tĩnh và tôi đang sử dụng lại từ điển, nhưng các kiểu không được hiển thị đúng cách.

public class resourceDictionaryProvider{ 
    public readonly ResourceDictionary StaticDictionary = 
    new ResourceDictionar {Source = new Uri(path)}; 
} 

Bất kỳ ai cũng có thể đề xuất những gì tôi đang làm sai, Vui lòng cung cấp đề xuất của bạn.

Sự cố xảy ra sau khi đã thay đổi ResourceDictionary thành static only.But mã sau hoạt động tốt.

public class resourceDictionaryProvider{ 
    public static readonly ResourceDictionary StaticDictionary = 
    new ResourceDictionar {Source = new Uri(path)}; 
} 

Bây giờ tôi đang tạo một cá thể cho lớp resourceDictionaryProvider và nó hoạt động tốt, Nhưng tôi không muốn tạo các cá thể Vì vậy, chỉ tôi đã thay đổi nó thành tĩnh.

Sự cố với từ khóa tĩnh ở đây là gì?

+6

Bạn không nên nhanh chóng ResourceDictionaries trong code-behind. Thay vào đó, chúng nên được khai báo trong các tệp XAML và (nếu cần) được truy cập từ mã phía sau. – Clemens

+1

Bạn có thể lồng từ điển tài nguyên vào các từ điển tài nguyên khác bằng cách sử dụng thuộc tính Nguồn như giải thích trong http://stackoverflow.com/questions/25023671/nested-resource-dictionary-in-separate-library. App.xaml chứa một từ điển tài nguyên sẽ được tải tự động với ứng dụng, vì vậy, những gì bạn đưa vào hoặc tham chiếu có sẵn để sử dụng ứng dụng rộng. –

+1

Vấn đề mà anh ta đang cố gắng giải quyết là một vấn đề nổi tiếng với các cá thể từ điển tài nguyên (hog tài nguyên chính vì nó sẽ tái tạo các từ điển bao gồm tất cả các từ điển mỗi khi chúng được tham chiếu thông qua một điều khiển) - anh ta đang cố sử dụng SharedResourceDictionary. Câu hỏi là hợp lệ và nó sẽ được tốt đẹp để xem một câu trả lời thực tế cho điều này. – Maverik

Trả lời

3

Đây là vấn đề được biết đến với WPF ResourceDictionaries. Giải pháp sẽ là tự mình triển khai một cấu trúc SharedResourceDictionary để ngăn việc tái tạo các tài nguyên trên mỗi lần sử dụng. Hãy xem liên kết này: WPF SharedResourceDictionary cho việc thực hiện tuyệt vời của các cấu trúc SharedResourceDictionary (Tất cả tín dụng cho các tác giả)

+1

một triển khai khác với giải thích một chút: http://www.wpftutorial.net/MergedDictionaryPerformance.html – Allender

1

Có hai vấn đề bạn cần phải giải quyết:.

  1. Các từ điển tài nguyên có thể được chia sẻ qua các mô-đun của dự án hoặc giải pháp của bạn;
  2. Sẽ rất tiện khi có từ điển tài nguyên thời gian thiết kế để hỗ trợ cài đặt tạo kiểu.

Để giải quyết vấn đề # 1, thật dễ dàng để thêm các từ điển tài nguyên của bạn vào file App.xaml, và sau đó họ sẽ được khởi tạo một lần, và sẽ có sẵn cho toàn bộ dự án, như thế này:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="pack://application:,,,/Themes;component/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Để giải quyết vấn đề # 2, bạn cần một giải pháp workaround mà điển tài nguyên được khởi tạo vào thời điểm thiết kế mà thôi. Kiểm tra Design time resource dictionary

và sau đó, bạn có thể sử dụng DesignTimeResourceDictionary trên UI của bạn, như thế này:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <designer:DesignTimeResourceDictionary 
       Source="pack://application:,,,/Themes;component/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
Các vấn đề liên quan