WPF某些样式未应用于DataTemplate控件
我正在努力学习WPF的一些知识,我对它的灵活性感到非常惊讶 然而,我遇到了WPF某些样式未应用于DataTemplate控件,wpf,xaml,styles,datatemplate,Wpf,Xaml,Styles,Datatemplate,我正在努力学习WPF的一些知识,我对它的灵活性感到非常惊讶 然而,我遇到了Styles和DataTemplates的一个问题,这有点让人困惑。 我在下面的测试页面中定义了一些样式等,发现中为边框定义的样式和文本块在数据模板中没有应用,但为进度条定义的样式应用的方式完全相同 源代码(我只使用Kaxaml和XamlPadX查看结果) 项目1 25 项目2 50 我怀疑这与默认样式等有关,但更令人费解的是为什么应用了一些Styles而没有。我在任何地方都找不到对上述行为的简单解释,因此我想问,是否
Style
s和DataTemplate
s的一个问题,这有点让人困惑。
我在下面的测试页面中定义了一些样式等,发现中为边框定义的样式
和文本块
在数据模板
中没有应用,但为进度条定义的样式
应用的方式完全相同
源代码(我只使用Kaxaml和XamlPadX查看结果)
项目1
25
项目2
50
我怀疑这与默认样式等有关,但更令人费解的是为什么应用了一些Style
s而没有。我在任何地方都找不到对上述行为的简单解释,因此我想问,是否有人愿意用拉门斯的术语解释这种行为,并可能与技术说明(即MSDN等)有联系
提前感谢您的支持 我也对此进行了调查,我个人认为这是一个bug。我注意到,如果您按以下方式命名样式,则会设置样式:
<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
etc...
等
并显式设置DataTemplate以使用这些样式:
<HierarchicalDataTemplate DataTemplate="TestElement">
<Border Height="45" Width="120" Margin="5,5", Style="{StaticResource BorderStyle}">
我认为,对于DataTemplates(可能还有ControlTemplates),除非您显式地设置它们,否则它们可能默认为空样式
这对我来说是不应该发生的-这不是WPF工作的逻辑方式…我也研究过这一点,我个人认为这是一个bug。我注意到,如果您按以下方式命名样式,则会设置样式:
<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
etc...
等
并显式设置DataTemplate以使用这些样式:
<HierarchicalDataTemplate DataTemplate="TestElement">
<Border Height="45" Width="120" Margin="5,5", Style="{StaticResource BorderStyle}">
我认为,对于DataTemplates(可能还有ControlTemplates),除非您显式地设置它们,否则它们可能默认为空样式
这对我来说是不可能发生的-这不是WPF工作的逻辑方式…这是因为ListBox是datatemplate项的逻辑父项,现在请记住,所有“可继承”的属性,如字体、前景色等,都是从逻辑父项派生的,ListBox已经以其自己的默认样式覆盖了它,这就是为什么这不起作用。然而,在这种情况下,您可以按照Dave先生的建议使用命名样式,但我认为如果它不起作用,那么这是列表框等的已知问题,您可以参考我的问题,我问题中的答案更详细。这是因为列表框是数据模板项的逻辑父项,现在请记住,所有“可继承”的属性(如字体、前景色等)都是从逻辑父级派生的,并且列表框已经以其自己的默认样式覆盖了它,这就是为什么这不起作用的原因。然而,在这种情况下,您可以按照Dave先生的建议使用命名样式,但我认为如果它不起作用,那么这是列表框等的已知问题,您可以参考我的问题,我问题中的答案更详细。这实际上是设计的。非从控件派生的元素不会获取隐式样式,除非它们位于应用程序资源中
这将更详细地解释这一点,或者您可以查看Connent。这实际上是设计的。非从控件派生的元素不会获取隐式样式,除非它们位于应用程序资源中
这将更详细地解释这一点,或者您可以查看Connent。我发现了一个简单的解决方法。对于无法在数据模板封装边界外搜索的任何元素(即未隐式设置样式),您可以在数据模板内为该元素类型声明一个空样式,并使用样式的BasedOn
属性查找要应用的数据模板外的正确隐式样式
在下面的示例中,TextBox能够在数据模板封装边界之外进行搜索(因为它继承自Control?),但TextBlock不能,因此我为它声明了空样式,可以在数据模板之外进行搜索
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
</DataTemplate.Resources>
<DockPanel>
<TextBlock Text="{Binding Name}" />
<TextBox Text="{Binding Value}" />
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
我发现了一个简单的解决方法。对于无法在数据模板封装边界外搜索的任何元素(即未隐式设置样式),您可以在数据模板内为该元素类型声明一个空样式,并使用样式的BasedOn
属性查找要应用的数据模板外的正确隐式样式
在下面的示例中,TextBox能够在数据模板封装边界之外进行搜索(因为它继承自Control?),但TextBlock不能,因此我为它声明了空样式,可以在数据模板之外进行搜索
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
</DataTemplate.Resources>
<DockPanel>
<TextBlock Text="{Binding Name}" />
<TextBox Text="{Binding Value}" />
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
感谢您的链接!它解释了正在发生的事情,但是仍然链接到官方文档会很好,因为我知道在哪里可以找到这些东西。在Microsoft的Connect网站上添加了错误报告的链接,但不确定是否有任何官方文档描述了这种行为。这两个链接现在都已失效。建立如果您愿意,请将其添加到您的答案中。谢谢您的链接!它解释了正在发生的事情,但仍然链接到官方文档将是很好的