Перемещение стилей 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" />

Другие вопросы по тегам