Как получить стиль из словаря ресурсов в коде в UserControlLibrary?

У меня есть библиотека управления пользователями с некоторыми словарями ресурсов. Код:

<ResourceDictionary   ... >
    <LinearGradientBrush x:Key="MyButtonBackground" EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#FF654073" Offset="0.084"/>
        <GradientStop Color="#FF8A6093" Offset="0.929"/>
    </LinearGradientBrush>


    <Style x:Key="MyButtonStyle" TargetType="{x:Type MyButton}" >
        <Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
        <Setter Property="Foreground" Value="White" />
    </Style>
</ResourceDictionary>

Тогда у меня есть класс для загрузки словаря ресурсов. В принципе:

return (ResourceDictionary)Application.LoadComponent(new System.Uri("/MyAssembly;component/Themes/Default.xaml", System.UriKind.Relative))

Теперь в классе User Control после получения Resource Dictionary я хочу загрузить стиль напрямую. Как я могу это сделать?

this.Style = ((Style)MyResourceDictionary["MyButtonStyle"]); // Don't work

Тем не мение:

this.Background = ((Brush)MyResourceDictionary["MyButtonBackground"]);   // Works

1 ответ

Какое исключение вы получаете за первое? На основании вашего описания, если this это UserControlвы получаете исключение, потому что Style вы пытаетесь подать заявление применимо только к MyButton,

Если вы пытаетесь создать кастом Control в WPF (который имеет совсем другой подход, чем UserControl), то вы делаете больше работы, чем нужно.

Во-первых, вы должны создать свой собственный элемент управления как класс (без страницы XAML):

public class MyButton : Button
{
    static MyButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(MyButton),
            new FrameworkPropertyMetadata(typeof(MyButton)));  
    }
}

А потом, в вашем RessourceDictionary, удалить x:Key от Style:

<Style TargetType="{x:Type MyButton}" >
    <Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
    <Setter Property="Foreground" Value="White" />
</Style>

Наконец, ваш ResourceDictionary должен быть включен в Project_Root\Themes\generic.xaml тематический словарь. Тогда вам вообще не нужно будет получать ресурсы из кода.

Для дальнейшего чтения у CodeProject есть довольно хорошее руководство по созданию пользовательского элемента управления WPF.

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