Как ссылаться на клавиши стиля WPF, определенные в отдельной сборке в другой библиотеке

StackOverflow https://stackoverflow.com/questions/2184871

Вопрос

У меня есть два библиотеки и одноместный набор проектов в сборе приложения, и мне интересно, как я могу ссылаться на их ключ в одном из моих библиотек, которые определены в другом.

Макет моего решения:

  • W pfcontrols.dll. - Удерживает общие многоразовые элементы управления, такие как NPF Numentupdown Control, а также другие основные элементы управления и некоторые стили, которые я хотел бы сделать многоразовый. Ради примера давайте скажем, мой стиль ключ здесь определяется как MyButtonStyle..
  • SpecializatedControls.dll.dll. - Удерживает элементы управления, которые специализируются на наше приложение, такие как пользовательские композитные элементы управления и UserControls в WPF. Это где я хотел бы ссылаться на MyButtonStyle. Стиль определен в WPFControls.dll сборки.
  • Application.exe. - Эта сборка использует элементы управления, определенные в сборке SpecializatedControls.dll.

Я видел некоторые примеры, объясняющие, как это сделать с помощью простой одной библиотеки управления и сборкой приложений, но в моем случае у меня есть две сборки и приложение. Так что другими словами в моем случае у меня нет app.xaml во второй библиотеке управления, где я мог бы использовать концепцию объединений. Я уверен, что я хочу, чтобы я хотел, чтобы я мог бы поставить ссылку на объединенные моменты, напрямую в каждом элементе управления XAML-файлом, чтобы объединить все универсальные .xaml, определенный в WPFControls.dll Assuate, но мое предположение состоит в том, что это приведет к вручению стилей в разных местах В моем ассамблее специальных корпусов, что не похоже на лучшее решение. Чтобы сделать все хуже, эти словари могут также быть объединены в Application.exe, а также это начинает раздувать мое приложение во время выполнения?

Кто-нибудь может уточнить, какой рекомендуемый или лучший подход для совместного использования таких стилей с наименьшим количеством программных и ресурсов накладной.

Обновлять: После небольшого количества тестирования появляется, что у меня проблемы с ссылкой на любой ресурс, определенный в Generic.xaml по отношению к его, даже в том же сборке. Там может быть что-то совершенно неверно о том, как я понимаю, как работают ключи ресурсов, поэтому мне придется немного больше исследований, а также искать компонентресурсию. Если у кого-нибудь есть какие-либо намеки или предложения, пожалуйста, помогите.

Это было полезно?

Решение

Поиск ресурсов в WPF работает в иерархии: вверх логическое дерево, затем ресурсы приложений, тематические ресурсы и, наконец, системные ресурсы.

Ресурсы темы обычно могут быть доступны только неявно (даже внутри сборки, которую они определены). Это актуально только для стилей, где TargetType можно использовать в качестве неявной ключа.

Для достижения того, что вы пытаетесь сделать, есть два варианта:

  • Использовать ComponentResourcekey.. Отказ Это специальный ключ ресурсов, который позволяет ссылаться на ресурсы из других сборок. Например, вы можете определить кисть в Wpfcontrols. Тематический словарь:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    И тогда вы можете ссылаться на это в Специализированныеконтрол:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Использовать Mergeddiedies. Чтобы импортировать словарь в прикладные ресурсы. Вы можете сделать это в Заявление сборка и при приложении нагрузки, даже контроли, которые находятся в Специализированныеконтрол сможет использовать эти ресурсы. У вас возникнут проблема с опытом работы с проектированием в этом сценарии, который вы можете решить, поместив поддельное приложение.xaml в Специализированныеконтрол, это также будет содержать ссылку на словарь.

Надеюсь это поможет,

Aelij.

Другие советы

Принятый ответ правильный, я просто объясняю, как использовать Mergeddiedies.

В App.xaml.,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top