我有以下自定义控件
public class MagicButton : Control
{
static MagicButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MagicButton),
new FrameworkPropertyMetadata(typeof(MagicButton)));
}
}
具有以下主题/Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication4">
<Style TargetType="{x:Type l:MagicButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type l:MagicButton}">
<Border />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type l:MagicButton}"
x:Key="OtherStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type l:MagicButton}">
<Border />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
当我使用默认样式使用MagicButton控件时,一切都正常,但当我尝试使用"OtherStyle"时
<l:MagicButton Style="{StaticResource OtherStyle}"/>
找不到样式,异常为"{"找不到名为"OtherStyle"的资源。资源名称区分大小写。"}">
然而,如果我将OtherStyle移到App.xaml,它就会起作用。
不过,我不想把它放在App.xaml中,我希望我的Themes/Generic.xaml文件包含默认样式以及密钥命名样式,人们可以使用显式选择这些样式
由于generic.xaml
文件没有代码隐藏,我们无法创建它的实例来从中读取Style
。CustomControl
s使用DefaultStyleKey
从中访问Style
s,如您在示例中所示。因此,您无法通过其他方式访问它。
但是,Application.Resources
是为该控件定义自定义Style
的正确位置,与所有其他控件一样。您非常乐意为Button
或任何其他.NET控件定义Style
,那么为什么不为自己的控件定义呢?
更新>>>
这不是一个特定于应用程序的样式,它是我想保留在主题/Generic.xml中的控件的一种替代样式,这样任何引用该主题的项目都可以使用它。
是的,但你试图在generic.xaml
之外引用它,但你不能。。。它不像CCD_ 11。可以将DependencyProperty
添加到控件中,该控件在内部设置不同的Style
。