2008-12-03 25 views
217

Tôi có các tệp từ điển tài nguyên (MenuTemplate.xaml, ButtonTemplate.xaml, vv) mà tôi muốn sử dụng trong nhiều ứng dụng riêng biệt. Tôi có thể thêm chúng vào các assembly của các ứng dụng, nhưng tốt hơn nếu tôi biên dịch các tài nguyên này trong một assembly đơn và có các ứng dụng của tôi tham khảo nó, đúng không?ResourceDictionary trong một assembly riêng biệt

Sau khi lắp ráp tài nguyên được xây dựng, làm thế nào tôi có thể tham chiếu nó trong ứng dụng App.xaml của tôi? Hiện tại tôi sử dụng ResourceDictionary.MergedDictionaries để hợp nhất các tệp từ điển riêng lẻ. Nếu tôi có chúng trong một hội đồng, làm thế nào tôi có thể tham khảo chúng trong xaml?

+1

Điều này có thể là quá mức cần thiết, nhưng bạn có thể chuẩn bị tài nguyên của mình cho Xuất khẩu bằng cách sử dụng kỹ thuật được mô tả ở đây: https://alexfeinberg.wordpress.com/2015/08/16/safely-export-wpf-resources/. Ưu điểm chính của việc này là ngăn chặn các vấn đề với nhiều phiên bản của assembly tài nguyên được nạp vào cùng một appdomain. – user195275

Trả lời

312

Khám phá pack URI syntax. Bạn muốn một cái gì đó như thế này:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/> 
+0

Nếu YourAssembly không nằm trong đường dẫn ứng dụng thì sao? – EngineerSpock

+0

@Engineer Spock: sau đó CLR sẽ không tìm thấy nó mà không cần trợ giúp (không có gì đặc biệt để làm với WPF). Thêm đường dẫn thăm dò vào * app.config * của bạn, hoặc đính kèm vào 'AppDomain.AssemblyResolve' để giúp nó tìm thấy assembly. –

+1

Tôi có cần thêm đường dẫn thăm dò nếu dự án YourAssembly ở cùng cấp với dự án ứng dụng cần tham chiếu YourAssembly không? Ví dụ: C: \ Solution \ AppProject \ và C: \ Solution \ YourAssemblyProject \ – EngineerSpock

88

Một ví dụ, chỉ để làm cho 15 giây trả lời -

Giả sử bạn có "styles.xaml" trong một thư viện WPF có tên là "phổ biến" và bạn muốn sử dụng nó từ dự án ứng dụng chính của bạn:

  1. Thêm một tài liệu tham khảo từ các dự án chính để "phổ biến" dự án
  2. App.xaml của bạn nên bao gồm:

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

Cheers

+2

Và sau đó làm thế nào để bạn thực hiện các tài nguyên được định nghĩa trong styles.xaml có sẵn thông qua cửa sổ thuộc tính Visual Studio 2010? Nếu tôi chọn một phần tử, và sau đó nhấp vào Áp dụng tài nguyên cho thuộc tính nền của nó, nó chỉ hiển thị SystemColors chứ không phải các phần tử được định nghĩa trong styles.xaml. Nhưng nếu tôi nhập tên tài nguyên trong XAML thì nó hoạt động, vì vậy nó được tham chiếu chính xác. – xr280xr

+0

Chỉ muốn thêm rằng nếu bạn tham khảo ResourceDictionary từ UserControl, thì bạn cần phải thêm một tham chiếu đến assembly ở cả hai nơi: trong UserControl và trong dự án cửa sổ chính. Nếu không, bạn sẽ nhận được lỗi thời gian chạy. – Gattuso

15

Resource-Only DLL là một lựa chọn cho bạn. Nhưng nó không nhất thiết phải trừ khi bạn muốn sửa đổi tài nguyên mà không cần biên dịch lại các ứng dụng. Chỉ có một tệp ResourceDictionary phổ biến cũng là một tùy chọn. Nó phụ thuộc mức độ thường xuyên bạn thay đổi các nguồn lực và vv

<ResourceDictionary Source="pack://application:,,,/ 
    <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/> 

MyAssembly - Chỉ cần lắp ráp tên mà không cần mở rộng

FolderStructureInAssembly - Nếu nguồn của bạn đang ở trong một folde, xác định cấu trúc thư mục

Khi bạn đang làm điều này, tốt hơn là nên biết về số siteOfOrigin.

WPF hỗ trợ hai cơ quan: application: /// and siteoforigin: ///. Ứng dụng: /// authority xác định các tệp dữ liệu ứng dụng mà được biết đến lúc biên dịch, bao gồm tệp tài nguyên và nội dung. siteoforigin: /// authority xác định trang web của tệp gốc. Phạm vi của mỗi cơ quan được thể hiện trong hình dưới đây.

enter image description here

4

Sử dụng XAML:

Nếu bạn biết assembly cấu trúc khác và muốn resources trong C# mã, sau đó sử dụng mã dưới đây:

ResourceDictionary dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute); 
foreach (var item in dictionary.Values) 
{ 
    //operations 
} 

Đầu ra: Nếu chúng tôi muốn sử dụng ResourceDictionaryRD1.xaml của dự án WpfControlLibrary1 vào dự án StackOverflowApp.

Cấu trúc của dự án:

Structure of Projects

điển Resource: Resource Dictionary

Mã Output:

Output

PS: Tất cả ResourceDictionary Tệp phải có Build Action là 'Resource' hoặc 'Page'.

Sử dụng C#:

Nếu bất cứ ai muốn giải pháp trong hoàn toàn C# mã sau đó xem tôi this solution.

4

Đối UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" /> 
Các vấn đề liên quan