У меня есть две библиотеки и единственное расположение проекта блока приложения, и я задаюсь вопросом, как может я стили ссылки их ключом в одной из моих библиотек, это определяется в другом.
Мое расположение решения:
Я видел, что некоторые примеры объясняют, как сделать это с простым единственным блоком библиотеки программ управления и приложения, но в моем случае у меня есть два блока и приложение. Так, другими словами, в моем случае у меня нет App.xaml в моей второй библиотеке программ управления, где я мог использовать понятие MergeDictionaries. Я вполне уверен, если бы я хотел, то я мог бы поместить ссылку MergedDictionaries непосредственно в каждого, управляет файлом XAML для слияния всех Generic.xaml, определенных в блоке WpfControls.dll, но мое предположение - то, что это привело бы к стилям, избыточно объединяемым в различные места в моем блоке SpecializedControls, который не походит на лучшее решение. Для усугубления положения эти словари могли бы также быть объединены в Application.exe также, это начинает чрезмерно увеличивать размер моего приложения во времени выполнения?
Может кто-либо разъясняться что рекомендуемый или лучший подход для совместного использования таких стилей с наименьшим количеством суммы programtic и ресурса наверху.
Обновление: После немного большего количества тестирования кажется, что я испытываю затруднения при ссылке на любой ресурс, определенный в Generic.xaml, он является ключевым даже в рамках того же блока. Может быть что-то полностью неправильное относительно того, как я понимаю, как ключи ресурса работают так, я должен буду немного больше исследовать, а также изучение ComponentResourceKey. Если у кого-либо есть какие-либо подсказки или предложения, помогите.
Это работает:
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--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.