Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
WPF某些样式未应用于DataTemplate控件_Wpf_Xaml_Styles_Datatemplate - Fatal编程技术网

WPF某些样式未应用于DataTemplate控件

WPF某些样式未应用于DataTemplate控件,wpf,xaml,styles,datatemplate,Wpf,Xaml,Styles,Datatemplate,我正在努力学习WPF的一些知识,我对它的灵活性感到非常惊讶 然而,我遇到了Styles和DataTemplates的一个问题,这有点让人困惑。 我在下面的测试页面中定义了一些样式等,发现中为边框定义的样式和文本块在数据模板中没有应用,但为进度条定义的样式应用的方式完全相同 源代码(我只使用Kaxaml和XamlPadX查看结果) 项目1 25 项目2 50 我怀疑这与默认样式等有关,但更令人费解的是为什么应用了一些Styles而没有。我在任何地方都找不到对上述行为的简单解释,因此我想问,是否

我正在努力学习WPF的一些知识,我对它的灵活性感到非常惊讶

然而,我遇到了
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网站上添加了错误报告的链接,但不确定是否有任何官方文档描述了这种行为。这两个链接现在都已失效。建立如果您愿意,请将其添加到您的答案中。谢谢您的链接!它解释了正在发生的事情,但仍然链接到官方文档将是很好的