如果没有给定 x:Key,样式 Setter 将不起作用

Style Setter doesn't work without given x:Key

如果将 TargetType 设置为 ListBox,则可以。 但我想将 TargetType 设置为 ListBox 内的 TextBlock。 我知道我可以使用 x:Key ,但为什么没有给定的 x:Key 它就不起作用??

<Window x:Class="WpfApp6.DataTemplatesLab"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp6"
        mc:Ignorable="d"
        Title="DataTemplatesLab" Height="450" Width="800">

    <Window.Resources>
        <SolidColorBrush x:Key="DataColor" Color="Firebrick"/>

        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="28"/>
            <Setter Property="Background" Value="Cyan"/>
        </Style>
        
    </Window.Resources>

    <ListBox x:Name="ListPersonals" Width="600">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="2*"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding Name}" Grid.Row="0"  />
                    <TextBlock Text="{Binding Gender}" Grid.Row="1" />
                    <TextBlock Text="{Binding Email}" Grid.Row="2" />
                    <TextBlock Text="{Binding Title}" Grid.Row="3"  />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

您需要使用键或在 DataTemplate 级别定义样式。

        <ListBox x:Name="ListPersonals" Width="600" ItemsSource="{Binding DemoCollection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Resources>
                        <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
                    </DataTemplate.Resources>

这是因为 DataTemplates 用作封装边界。这意味着任何基于 TargetType 的样式查找都会在 DataTemplate 处停止。

请注意 App.xaml 中定义的样式是此规则的一个例外。如果您要在 app.xaml 中定义样式资源,即使不在 DataTemplate

中重新定义它们,样式也会应用于内部控件