2012-12-20 21 views
9

Tôi có một số mã như thế nàyLiệu mỗi tham chiếu đến một ResourceDictionary tạo một đối tượng mới, hoặc làm ResourceDictionaries có một cơ chế bộ nhớ đệm

 _images = new ResourceDictionary 
     { 
      Source = new Uri(@"pack://application:,,,/Trilogy.T1TY2012.Transmission;component/Resources/Images.xaml") 
     }; 

xuất hiện nhiều lần trong ứng dụng của tôi (đôi khi như C# và đôi khi là tương đương XAML). Mỗi cá thể có chứa các cá thể riêng biệt của từng tài nguyên của nó hay không, hoặc có cơ chế đệm ẩn đằng sau cảnh chia sẻ các tài nguyên đó trên tất cả các từ điển tài nguyên không?

Tôi đang cố gắng quyết định xem liệu tôi có cần sử dụng hiệu quả các từ điển tài nguyên (ví dụ: chia sẻ các cá thể cụ thể) hay không hoặc liệu tối ưu hóa này đã được WPF xử lý chưa.

Trả lời

5

Nếu tôi hiểu câu hỏi của bạn, thì câu trả lời là, họ không được "lưu trữ" * giữa ResourceDictionary trường hợp khác nhau: một thể hiện của ResourceDictionary sẽ không sử dụng bất kỳ tài nguyên cùng loại/quan trọng mà có thể có được đã được khởi tạo trong một ResourceDictionary khác. Đó là để được tương phản, tất nhiên, để các phím trong một ResourceDictionary duy nhất; mỗi mục trong số đó thực sự được "lưu trữ", theo nghĩa là chúng được tạo một lần và được chia sẻ (với ngoại lệ đối với các tài nguyên có giá trị, được sao chép trên mỗi lần sử dụng).

Vì vậy, bạn phải quản lý phạm vi tài nguyên của mình nếu chúng là bộ nhớ chuyên sâu. Bạn luôn có thể đặt từng tài nguyên vào từ điển chính App.xaml, đảm bảo mỗi mục nhập sẽ được khởi tạo một lần và được chia sẻ cho tất cả người tiêu dùng của nó. Lưu ý rằng the resources are lazy-loaded:

Các mục trong ResourceDictionary không được xử lý ngay khi mã ứng dụng được tải bởi trình tải XAML. Thay vào đó, ResourceDictionary vẫn tồn tại như một đối tượng và các giá trị riêng lẻ chỉ được xử lý khi chúng được yêu cầu cụ thể.

Vì vậy, bạn không phải lo lắng về việc tải ứng dụng tất cả tài nguyên trong App.xaml khi khởi động; nó tải chúng chỉ khi cần thiết.

+0

làm tôi hiểu được điều này một cách chính xác, rằng trong trường hợp 'App .Xaml' có tài nguyên 'Foo.Xaml' và cũng sử dụng' MyButton.Xaml' làm phần tử giao diện người dùng - lần lượt cũng tham chiếu tài nguyên 'Foo.Xaml' là' MergedDictionary', 'Foo.xaml' chỉ được tải một lần? Hoặc sẽ có hai trường hợp? – BatteryBackupUnit

0

Để có một cuốn từ điển đó sẽ không được khởi tạo cho mỗi sử dụng

/// <summary> 
    /// The shared resource dictionary is a specialized resource dictionary 
    /// that loads it content only once. If a second instance with the same source 
    /// is created, it only merges the resources from the cache. 
    /// </summary> 
    public class SharedResourceDictionary : ResourceDictionary 
    { 
     /// <summary> 
     /// Internal cache of loaded dictionaries 
     /// </summary> 
     public static Dictionary<Uri, ResourceDictionary> _sharedDictionaries = 
      new Dictionary<Uri, ResourceDictionary>(); 

     /// <summary> 
     /// Local member of the source uri 
     /// </summary> 
     private Uri _sourceUri; 

     /// <summary> 
     /// Gets or sets the uniform resource identifier (URI) to load resources from. 
     /// </summary> 
     public new Uri Source 
     { 
      get { return _sourceUri; } 
      set 
      { 
       _sourceUri = value; 

       if (!_sharedDictionaries.ContainsKey(value)) 
       { 
        // If the dictionary is not yet loaded, load it by setting 
        // the source of the base class 
        base.Source = value; 

        // add it to the cache 
        _sharedDictionaries.Add(value, this); 
       } 
       else 
       { 
        // If the dictionary is already loaded, get it from the cache 
        MergedDictionaries.Add(_sharedDictionaries[value]); 
       } 
      } 
     } 
    } 

Đối với các nguồn lực tự u có thể chơi với x: attribute chia sẻ