如何从代码隐藏中的资源字典中获取样式到UserControlLibrary?

时间:2013-08-12 15:02:46

标签: c# wpf resourcedictionary

我有一个用户控件库,带有一些资源字典。代码:

<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))

现在,在UserControl类中,获取ResourceDictionary之后,我想直接加载Style。我怎么能这样做?

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

然而:

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

1 个答案:

答案 0 :(得分:0)

第一个例外有什么例外?根据您的说明,如果thisUserControl,则会收到例外情况,因为您尝试申请的Style仅适用于MyButton

如果您尝试在WPF中创建自定义Control(其方法与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控件。