Как ссылаться на ключи стиля WPF, определенные в отдельной сборке в другой библиотеке - PullRequest
12 голосов
/ 02 февраля 2010

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

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

  • WpfControls.dll - содержит общие многократно используемые элементы управления, такие как основанный на WPF элемент управления NumericUpDown, а также другие базовые элементы управления и некоторые стили, которые я хотел бы сделать повторно используемыми. Для примера скажем, что мой ключ стиля здесь определен как MyButtonStyle .
  • SpecializedControls.dll - содержит элементы управления, специализированные для нашего приложения, такие как настраиваемые составные элементы управления и пользовательские элементы управления в WPF. Здесь я бы хотел сослаться на стиль MyButtonStyle , определенный в сборке WpfControls.dll.
  • Application.exe - эта сборка использует элементы управления, определенные в сборке SpecializedControls.dll.

Я видел несколько примеров, объясняющих, как сделать это с помощью простой единой библиотеки управления и сборки приложения, но в моем случае у меня есть две сборки и приложение. Другими словами, в моем случае у меня нет App.xaml во второй библиотеке управления, где я мог бы использовать концепцию MergeDictionaries. Я вполне уверен, что если бы я захотел, я мог бы поместить ссылку MergedDictionaries непосредственно в каждый файл XAML элементов управления, чтобы объединить весь Generic.xaml, определенный в сборке WpfControls.dll, но я предполагаю, что это приведет к избыточному объединению стилей в различных местах. в моей сборке SpecializedControls, которая не кажется лучшим решением. Что еще хуже, эти словари также могут быть объединены с Application.exe, это начинает раздувать мое приложение во время выполнения?

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

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

Ответы [ 2 ]

14 голосов
/ 18 февраля 2010

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

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

Чтобы выполнить то, что вы пытаетесь сделать, есть два варианта:

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

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

    И затем вы можете ссылаться на нее в SpecializedControls :

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Используйте MergedDictionaries для импорта словаря в ресурсы приложения.Это можно сделать в сборке Application , и при загрузке приложения даже элементы управления, находящиеся в SpecializedControls , смогут использовать эти ресурсы.В этом сценарии у вас возникнет проблема со временем разработки, которую можно решить, поместив в SpecializedControls поддельный файл App.xaml, который также будет содержать ссылку на словарь.

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

Aelij.

0 голосов
/ 06 февраля 2019

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

In 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>
...