样式不适用于 ListView 中的 StackPanel 项目 - Windows 通用

Style doesn't apply to StackPanel items in ListView - Windows Universal

我创建了一个带有数据绑定的列表视图和一个 "Itemstemplate",它采用 "Datatemplate",其中我有一个 Stackpannel,但样式不适用于 Stackpannel,没有 space 在堆栈面板中的文本块之间:

 <ListView Grid.Row="1" DataContext="{Binding Source={StaticResource ViewModel}}" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Background="Gray" >
                    <StackPanel.Resources>
                        <Style TargetType="TextBlock" x:Key="margintextblock">
                            <Setter Property="Margin" Value="10,0,0,0"/>
                        </Style>
                    </StackPanel.Resources>
                    <TextBlock Style="{StaticResource listviewtextblock}" Text="{Binding Path=Firstname}" Foreground="Gold"></TextBlock>
                    <TextBlock Style="{StaticResource listviewtextblock}" Text="{Binding Path=Lastname}" Foreground="Black"></TextBlock>
                    <TextBlock Style="{StaticResource listviewtextblock}" Text="{Binding Path=Id}" Foreground="OrangeRed"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

怎么了?

您必须删除 x:Key="margintextblock" 因为这个样式不会自动应用到 TextBlocks

通过在样式上设置 x:Key 属性,您告诉 WPF 只有当您在特定控件上显式引用它时才想使用该样式。

看看this tutorial

已编辑

而且您还有另一个问题 - 您正在为您的 TextBlocks 设置样式 Style="{StaticResource listviewtextblock}"

在这种情况下,您需要做的是从 listviewtextblock 样式继承 StackPanel TextBlock 样式

<StackPanel.Resources>
    <Style TargetType="TextBlock" BasedOn="{StaticResource listviewtextblock}">
         <Setter Property="Margin" Value="10,0,0,0"/>
     </Style>
 </StackPanel.Resources>

并从 TextBlocks

中删除样式 Style="{StaticResource listviewtextblock}"

你的代码应该是这样的

 <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Background="Gray" >
                    <StackPanel.Resources>
                        <Style TargetType="TextBlock" BasedOn="{StaticResource listviewtextblock}" >
                            <Setter Property="Margin" Value="10,0,0,0"/>
                        </Style>
                    </StackPanel.Resources>
                    <TextBlock Text="{Binding Path=Firstname}" Foreground="Gold"></TextBlock>
                    <TextBlock Text="{Binding Path=Lastname}" Foreground="Black"></TextBlock>
                    <TextBlock Text="{Binding Path=Id}" Foreground="OrangeRed"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>