РесурсD Dictionary в окрему збірку


245

У мене є файли словника ресурсів (MenuTemplate.xaml, ButtonTemplate.xaml тощо), які я хочу використовувати в декількох окремих програмах. Я міг би додати їх до збірок програм, але краще, якщо я збираю ці ресурси в одну єдину збірку і чи мої програми звертаються до неї, правда?

Як будувати збірку ресурсів, як я можу посилатись на неї у App.xaml моїх додатків? В даний час я використовую ResourceDictionary.MergedDic Dictionary для об'єднання окремих файлів словника. Якщо я маю їх у складі, як я можу посилатись на них у xaml?


1
Це може бути надлишковим, але ви можете підготувати свої ресурси для експорту за допомогою описаної тут техніки: alexfeinberg.wordpress.com/2015/08/16/… . Основна перевага цього - запобігти проблемам із завантаженням декількох версій ресурсу в один додаток.
користувач195275

Відповіді:


353

Перевірте синтаксис URI пакета . Ви хочете щось подібне:

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

1
Що робити, якщо YourAssembly не міститься всередині шляху програми?
SaneDeveloper

@Engineer Spock: тоді CLR не знайде його без допомоги (нічого конкретно не стосується WPF). Або додайте шляхи зондування до своєї програми app.config , або додайте, AppDomain.AssemblyResolveщоб допомогти їй знайти збірку.
Kent Boogaart

1
Чи потрібно мені додати зондуючий шлях, якщо проект YourAssembly знаходиться на тому ж рівні, що і проект-приклад, який потребує посилання на YourAssembly? Наприклад, C: \ Solution \ AppProject \ і C: \ Solution \ YourAssemblyProject \
SaneDeveloper

1
@EngineerSpock: це окреме питання, тому, будь ласка, відкрийте його.
Kent Boogaart

2
Ця відповідь не має сенсу. Для того, щоб дотримуватися цього, потрібно вже знати, як це зробити!
користувач1040323

97

Приклад, лише щоб відповісти на це за 15 секунд відповідь -

Скажіть, у вас є "styles.xaml" у бібліотеці WPF з назвою "загальна", і ви хочете використовувати її у вашому головному проекті проекту:

  1. Додайте посилання з основного проекту на "загальний" проект
  2. Ваш app.xaml повинен містити:

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

Ура


2
Тоді як зробити ресурси, визначені у styles.xaml, доступними через вікно Властивості Visual Studio 2010? Якщо я виберіть елемент, а потім натисніть Застосувати ресурс для його властивості Background, він відображатиме лише SystemColors, а не ті, що визначені в styles.xaml. Але якщо я сам ввожу ім'я ресурсу в XAML, він працює, тому він правильно посилається.
xr280xr

Просто хотів додати, що якщо ви посилаєтесь на ResourceDictionary від UserControl, то вам потрібно додати посилання на збірку в обох місцях: в UserControl та в проекті головного вікна. Інакше ви отримаєте помилку виконання.
Андрейс Гасіловс


16

DLL лише для ресурсів - це варіант для вас. Але це не обов'язково, якщо ви не бажаєте змінювати ресурси без перекомпіляції програм. Мати лише один загальний файл ResourceDictionary - це також можливість. Це залежить від того, як часто ви змінюєте ресурси тощо.

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

MyAssembly - просто назва збірки без розширення

FolderStructureInAssembly - якщо ваші ресурси знаходяться в складці, вкажіть структуру папки

Коли ви це робите, краще також знати сайт siteOfOrigin .

WPF підтримує два повноваження: application: /// та siteoforigin: ///. Додаток: /// повноваження ідентифікує файли даних програми, які відомі під час компіляції, включаючи файли ресурсів та вмісту. Орган siteoforigin: /// ідентифікує файли файлів походження. Обсяг кожного органу представлений на наступному малюнку.

введіть тут опис зображення



4

Використання XAML:

Якщо ви знаєте іншу assemblyструктуру і хочете resourcesв C # код, а потім використовуйте наступний код:

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

Вихід: Якщо ми хочемо використовувати ResourceDictionary RD1.xamlProject WpfControlLibrary1у StackOverflowAppпроекті.

Структура проектів :

Структура проектів

Словник ресурсів: Словник ресурсів

Вихід коду:

Вихідні дані

PS: Усі ResourceDictionaryфайли повинні мати Build Action" Resource" або " Page".

Використання C #:

Якщо хтось хоче рішення в чисто c # коді, то подивіться моє це рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.