我有一个用户控件库,带有一些资源字典。代码:
<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
答案 0 :(得分:0)
第一个例外有什么例外?根据您的说明,如果this
是UserControl
,则会收到例外情况,因为您尝试申请的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控件。