如果没有给定 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
中重新定义它们,样式也会应用于内部控件
如果将 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
中重新定义它们,样式也会应用于内部控件