ResourceDixi trong một hội đồng riêng biệt


245

Tôi có các tệp từ điển tài nguyên (MenuTemplate.xaml, ButtonTemplate.xaml, v.v.) 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 cụm của ứng dụng, nhưng sẽ tốt hơn nếu tôi biên dịch các tài nguyên này trong một cụm duy nhất và để các ứng dụng của tôi tham chiếu nó, phải không?

Sau khi tập hợp tài nguyên được xây dựng, làm cách nào tôi có thể tham chiếu nó trong App.xaml trong các ứng dụng của mình? Hiện tại tôi sử dụng ResourceDipedia.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 chiếu chúng trong xaml?


1
Đây có thể là một khoản quá mức, nhưng bạn có thể muốn chuẩn bị tài nguyên cho Xuất khẩu bằng cách sử dụng kỹ thuật được mô tả ở đây: alexfeinberg.wordpress.com/2015/08/16/ . Ưu điểm chính của việc này là ngăn chặn các sự cố với nhiều phiên bản của tài nguyên được tải vào cùng một tên miền.
195275

Câu trả lời:


352

Kiểm tra cú pháp gói URI . Bạn muốn một cái gì đó như thế này:

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

1
Điều gì xảy ra nếu YourAssugging không được chứa trong đường dẫn ứng dụng?
SaneDeveloper

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

1
Tôi có cần thêm đường dẫn thăm dò nếu dự án YourAssugging ở cùng cấp độ với dự án ứng dụng cần tham chiếu YourAssugging không? Chẳng hạn, C: \ Solution \ AppProject \ và C: \ Solution \ YourAssuggingProject \
SaneDeveloper

1
@EngineerSpock: đây là một câu hỏi riêng biệt, vì vậy vui lòng mở một câu hỏi.
Kent Boogaart

2
Câu trả lời này không có ý nghĩa. Để làm theo nó người ta cần phải biết cách làm điều đó!
dùng1040323

97

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

Giả sử bạn có "style.xaml" trong thư viện WPF có tên "common" và bạn muốn sử dụng nó từ dự án ứng dụng chính của mình:

  1. Thêm một tham chiếu từ dự án chính vào dự án "chung"
  2. Ứng dụng.xaml của bạn nên chứa:

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

Chúc mừng


2
Và sau đó, làm thế nào để bạn cung cấp các tài nguyên được xác định trong style.xaml qua cửa sổ Thuộc tính Visual Studio 2010? Nếu tôi chọn một phần tử, sau đó bấm Áp dụng tài nguyên cho thuộc tính Nền, nó chỉ hiển thị SystemColors chứ không hiển thị các phần tử được xác định trong style.xaml. Nhưng nếu tôi tự gõ 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

Chỉ muốn thêm rằng nếu bạn tham chiếu ResourceDipedia từ UserControl, thì bạn cần thêm một tham chiếu đến cụm ở cả hai vị trí: 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.
Andrejs Gasilovs


16

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

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

MyAssugging - Chỉ cần lắp ráp tên mà không cần gia hạn

FolderStr structInAssugging - Nếu tài nguyên của bạn ở dạng gấp, chỉ đị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ề siteOfOrigin .

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

nhập mô tả hình ảnh ở đây


8

Đối với UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

4

Sử dụng XAML:

Nếu bạn biết người kia assemblycấu trúc và muốn resourcestrong 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 ta muốn sử dụng ResourceDictionary RD1.xamlProject WpfControlLibrary1vào StackOverflowAppdự án.

Cơ cấu dự án :

Cơ cấu dự án

Từ điển tài nguyên: Từ điển tài nguyên

Mã đầu ra:

Đầu ra

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

Sử dụng C #:

Nếu ai muốn giải pháp hoàn toàn mã c # thì hãy xem giải pháp này của tôi .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.