1

我有一个用户控件库,其中包含一些资源字典。代码:

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

1 回答 1

0

第一个例外是什么?根据您的描述, if thisis a UserControl,您将获得例外,因为Style您尝试申请的仅适用于 a MyButton

如果您尝试Control在 WPF 中创建自定义(其方法与 a 有很大不同UserControl),那么您所做的工作超出了您的需要。

首先,您将自定义控件创建为一个类(无 XAML 页面):

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

然后,在您的中,从 中RessourceDictionary删除:x:KeyStyle

<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 控件。

于 2013-08-12T15:16:03.543 回答