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

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

Мое расположение решения:

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

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

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

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

12
задан Dave Clemmer 15 August 2011 в 17:34
поделиться

1 ответ

Это работает:

template<typename T>
struct tovoid {
  typedef void type;
};

template<typename T, typename = void>
struct value_type {
  typedef typename T::value_type type;
  static type get(T const& t) {
    return *t.begin();
  }
};

template<typename T>
struct value_type<T, typename tovoid<typename T::mapped_type>::type> {
  typedef typename T::mapped_type type;
  static type get(T const& t) {
    return t.begin()->second;
  }
};

template<typename Container>
typename value_type<Container>::type first(Container const& c){
    return value_type<Container>::get(c);
}

int main() {
  std::map<int, int> m; m[0] = 42; std::cout << first(m);
  std::vector<int> a(1, 43); std::cout << first(a);
}

(выходы 4243 )

-121--4378622-

Обычно это то, что автоматически добавляется системой управления версиями.

-121--4716277-

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

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

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

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

     < LinearGradityBrush x: Key = «{ComponentResoureKey TypeInTargetAssembly = local: MyClass, ResoureId = MyBrush}» >
    < GradiveStop Color = «Красный »/>
    < GradiveStop Color = «Blue» Offset = «1 »/>
    
    

    А затем вы можете сослаться на него в Элементы управления :

     < Пользовательский фон управления = "{GroupResource {ComponentResoureKey TypeInTargetAssembly = wpfControls: MyClass, ResoureId = MyBrush}"} "/>
    
  • Для импорта словаря в ресурсы приложения используйте Словари . Это можно сделать в сборке Application , и при загрузке приложения даже элементы управления, находящиеся в TalkingControls , смогут использовать эти ресурсы. В этом сценарии возникнет проблема с временем разработки, которую можно решить, поместив фальшивый файл App.xaml в Приложение Controls , который также будет содержать ссылку на словарь.

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

Aelij.

14
ответ дан 2 December 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: