Перемещение стилей App.xaml в словарь ресурсов
У меня есть пользовательский элемент управления, который использует стили в словаре ресурсов, который связан в app.xaml. Если я уберу ссылку и добавлю ссылку на страницу, содержащую элемент управления, она не будет работать. Это почему? Зачем моему элементу управления (dll), чтобы стили были в app.xaml, а не только на странице, на которой содержится элемент управления?
2 ответа
Зачем моему элементу управления (dll), чтобы стили были в app.xaml, а не только на странице, на которой содержится элемент управления?
Для пользовательских элементов управления нужен стиль по умолчанию. Этот стиль по умолчанию устанавливается в конструкторе. например:
public CustomControl()
{
DefaultStyleKey = typeof(CustomControl);
}
Когда это установлено, это смотрит в пределах содержащей сборки для этого стиля. Если элемент управления находится внутри приложения, он просматривается в App.xaml. Если элемент управления находится в библиотеке классов, он просматривается в файле Generic.xaml, который должен быть помещен в папку "Темы". Вам не нужно размещать стиль в любом из этих файлов. Вы можете создать отдельный файл, содержащий стиль, и ссылаться на него из файла App.xaml или Themes/Generic.xaml (в зависимости от того, где определен элемент управления). Для этого вы создаете MergedDictionary в одном из этих файлов. Если ваш контроль определен в вашем приложении, вы бы сделали
<Application x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--Application Resources-->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Controls/CustomControl.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<Application.Resources>
</Application>
Если ваш элемент управления определен в библиотеке классов, Themes / Generic.xaml должен выглядеть следующим образом
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/My.Custom.Assembly;component/FolderLocationOfXaml/CustomControl.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Независимо от того, где находится пользовательский элемент управления, xaml всегда будет выглядеть одинаково.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:My.Custom.Assembly.Controls">
<Style TargetType="local:CustomControl">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CustomControl">
<Grid>
<! -- Other stuff here -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Без определения этого стиля по умолчанию невозможно определить, какой стиль переопределить. После определения стиля по умолчанию вы можете изменить стиль в своем приложении или в любом другом месте, где используется элемент управления.
Попробуйте переместить стиль в элемент управления, чтобы убедиться в наличии всех необходимых ссылок для элемента управления для использования элементов из словаря. Убедитесь, что проект, содержащий ваш UserControl, имеет ссылку на проект, который содержит словарь ресурсов. Проверьте исходный путь к словарю:
<ResourceDictionary Source="/AssemblyName;component/StylesFolderName/ResourceDictionaryName.xaml" />