WPF 某些样式未应用于 DataTemplate 控件 [英] WPF Some styles not applied on DataTemplate controls
问题描述
我正在尝试了解有关 WPF 的知识,并且对其灵活性感到非常惊讶.
I am trying to learn something about WPF and I am quite amazed by its flexibility.
但是,我遇到了 Style
s 和 DataTemplate
s 的问题,这有点令人困惑.我在下面的测试页面中定义了一些样式等,发现
中为 Border
定义的 Style
s> 和 TextBlock
未应用在 DataTemplate
中,但应用了以完全相同方式定义的 ProgressBar
的 Style
.
However, I have hit a problem with Style
s and DataTemplate
s, which is little bit confusing.
I have defined below test page to play around a bit with styles etc and found that the Style
s defined in <Page.Resources>
for Border
and TextBlock
are not applied in the DataTemplate
, but Style
for ProgressBar
defined in exactly the same way is applied.
源码(我只是用Kaxaml和XamlPadX查看结果)
Source code (I just use Kaxaml and XamlPadX to view the result)
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style TargetType="{x:Type Border}">
<Setter Property="Background" Value="SkyBlue"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="CornerRadius" Value="5"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
</Style>
<Style TargetType="{x:Type ProgressBar}">
<Setter Property="Height" Value="10"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Foreground" Value="Red"/>
</Style>
<XmlDataProvider x:Key="TestData" XPath="/TestData">
<x:XData>
<TestData xmlns="">
<TestElement>
<Name>Item 1</Name>
<Value>25</Value>
</TestElement>
<TestElement>
<Name>Item 2</Name>
<Value>50</Value>
</TestElement>
</TestData>
</x:XData>
</XmlDataProvider>
<HierarchicalDataTemplate DataType="TestElement">
<Border Height="45" Width="120" Margin="5,5">
<StackPanel Orientation="Vertical" Margin="5,5" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock HorizontalAlignment="Center" Text="{Binding XPath=Name}"/>
<ProgressBar Value="{Binding XPath=Value}"/>
</StackPanel>
</Border>
</HierarchicalDataTemplate>
</Page.Resources>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<Border Height="45" Width="120" Margin="5,5">
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock HorizontalAlignment="Center" Text="Item 1"/>
<ProgressBar Value="25"/>
</StackPanel>
</Border>
<Border Height="45" Width="120" Margin="5,5">
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock HorizontalAlignment="Center" Text="Item 2"/>
<ProgressBar Value="50"/>
</StackPanel>
</Border>
</StackPanel>
<ListBox Margin="10,10" Width="140" ItemsSource="{Binding Source={StaticResource TestData}, XPath=TestElement}"/>
</StackPanel>
</Page>
我怀疑它与默认样式等有关,但更令人费解的是为什么应用了一些 Style
而另一些则没有.我在任何地方都找不到对上述内容的简单解释,因此想问问是否有人愿意用 lamen 的术语解释这种行为,并附上指向技术描述(即 MSDN 等)的可能链接.
I suspect it has something to do with default styles etc, but more puzzling is why some Style
s are applied and some not. I cannot find an easy explanation for above anywhere and thus would like to ask if someone would be kind enough to explain this behaviour in lamens' terms with possible links to technical description, i.e. to MSDN or so.
提前感谢您的支持!
推荐答案
这实际上是设计使然.不是从 Control 派生的元素不会选择隐式样式,除非它们在应用程序资源中.
This is actually by design. Elements that do not derive from Control will not pick up implicit Styles, unless they are in the application resources.
这个 link 更详细地解释了这一点,或者您可以查看 Connent 错误报告.
This link explains this in more detail, or you can view the Connent bug report.
这篇关于WPF 某些样式未应用于 DataTemplate 控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!