Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml WPF、自定义控件和样式/主题继承_Xaml_Wpf Controls - Fatal编程技术网

Xaml WPF、自定义控件和样式/主题继承

Xaml WPF、自定义控件和样式/主题继承,xaml,wpf-controls,Xaml,Wpf Controls,我正在做一个已经存在的项目,在那里我无法按照我想要的方式进行造型 我从一个应用程序开始,其中: 资源文件夹中有一个WhistrBlue.xaml文件 文件中的样式使用TargetType自动应用它们 有一个为扩展器控件定义的样式(更多信息,下一步) 我不想弄乱这个文件 该文件通过App.xaml中的合并资源在应用程序中显式使用 到目前为止,一切正常 然后 我正在构建一个自定义控件,该控件派生自扩展器: internal partial class TestExpander : Expand

我正在做一个已经存在的项目,在那里我无法按照我想要的方式进行造型

我从一个应用程序开始,其中:

  • 资源文件夹中有一个WhistrBlue.xaml文件
  • 文件中的样式使用TargetType自动应用它们
  • 有一个为扩展器控件定义的样式(更多信息,下一步)
  • 我不想弄乱这个文件
  • 该文件通过App.xaml中的合并资源在应用程序中显式使用
到目前为止,一切正常


然后

我正在构建一个自定义控件,该控件派生自扩展器

internal partial class TestExpander : Expander
通过创建自定义控件,VStudio已将主题文件夹添加到项目中,其中包含常用的Generic.xaml文件。在此文件中,我为自定义控件创建了样式:

<Style TargetType="{x:Type local:TestExpander}" BasedOn="{StaticResource {x:Type Expander}}">
    <Style.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibility"/>
    </Style.Resources>

    <Setter Property="ExpandDirection" Value="Down"/>
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="Cursor" Value="Hand"/>
</Style>

我希望我的TestExpander继承WhistlerBlue.xaml中定义的Expander风格,通过自己的风格添加自己的定制,他们从此过上了幸福的生活


它没有发生。我错在哪里?

因此,当我们为各种事物创建继承架构时,很容易忘记事物如何接收其继承部分的顺序。例如,当我们把一个BasedOn放在直接看
x:Type
的位置上时,它就会按照继承的顺序来寻找它,对吗

这样,当它在查找
x:Type
时,它没有意识到另一个字典中有重写……它直接进入默认的原始版本。但是,如果我们通过
ResourceDictionary.MergedDictionaries
注入包含您想要从中继承的内容的字典,那么它知道在他返回框架默认值之前,首先要查看他,这一切都是好的

但另一方面,当您以这种方式合并字典以进行继承时,您必须注意自己的操作方式,否则可能会导致性能下降。因为如果说它是一个合并的词典……在运行时,它会将词典中的所有内容都合并,并将所有内容复制到新的词典中


所以在这个例子中……如果是我,我可能会省略generic.xaml字典的内容(如果它不是真的需要),并将该模板放在现有字典中它要从中继承的模板的下面。那么你就不会再有一本完整的字典了,它仍然会得到它的继承,生活应该是美好的。希望这有帮助。:)

您的新资源字典(generic.xaml)中是否有包含您试图从中继承的样式模板的资源字典声明为
ResourceDictionary.MergedDictionaries
,以便它可以找到它?@ChrisW。你是我的英雄。别担心,我们都去过。干杯。:)@克里斯。是的,但是我从技术出现的第一天起就在开发WPF应用程序……我不应该犯这些错误:-\n无论如何……发布一个答案,这样我就可以接受了,怎么样?当然,如果这能让你感觉更好的话,我只是花了一个多小时试图弄明白一些事情,同时在多个复杂的对象数组中对数据进行处理,以找到一双新鲜的眼睛可能会在几秒钟内发现的东西,并称之为新手错误lol。在我们的业务中保持谦虚是件好事。:)
static TestExpander()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(TestExpander), new FrameworkPropertyMetadata(typeof(TestExpander)));
        }