从父级继承前景值,就像 UWP 中的 TextBlock
Inherit foreground value from the parent just as TextBlock in UWP
当我在我的 ListViewItem style 中设置 SelectedForeground 时,项目 DataTemplate 中的 TextBlock 按预期更改了选择时的颜色。我希望将相同的颜色应用于 DataTemplate 中的其他元素,例如路径或矩形:
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="Hello" />
<Path Fill={?} />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
我尝试创建自定义控件并应用模板:
<ControlTemplate x:Key="myControlTemplate" TargetType="local:myControl">
<Grid>
<TextBlock Text="Hello" />
<Path Fill="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</ControlTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<controls:myControl Template="{StaticResource myControlTemplate}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
在那种情况下,路径确实继承了 ListViewItemPresenter 的值,但只有一次 - 它不会在选择更改时更新值。
如何强制 Path.Fill 属性 像 TextBlock 一样更新它的颜色?
在 ControlTemplate
中,"templated parent" 是控件本身,因此将自定义控件添加到组合中对您没有任何帮助。
您可能想要的是这个。我无法在此处的 UWP 中对其进行测试,所以如果您遇到任何错误,请告诉我。
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="Hello" />
<Path
x:Name="MyPath"
Fill="YellowGreen"
Data="M 0,0 L 16,0 L 16,16 L 0,16 Z"
/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}"
Value="True">
<Setter
TargetName="MyPath"
Property="Fill"
Value="{Binding SelectedForeground, RelativeSource={RelativeSource AncestorType=ListView}}"
/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>
您可以直接在 listView 的项模板中使用 relativeSource。
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Width="24"
Height="24"
Fill="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>
<TextBlock Text="{Binding}"
x:Name="TitleBlock"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
当我在我的 ListViewItem style 中设置 SelectedForeground 时,项目 DataTemplate 中的 TextBlock 按预期更改了选择时的颜色。我希望将相同的颜色应用于 DataTemplate 中的其他元素,例如路径或矩形:
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="Hello" />
<Path Fill={?} />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
我尝试创建自定义控件并应用模板:
<ControlTemplate x:Key="myControlTemplate" TargetType="local:myControl">
<Grid>
<TextBlock Text="Hello" />
<Path Fill="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</ControlTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<controls:myControl Template="{StaticResource myControlTemplate}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
在那种情况下,路径确实继承了 ListViewItemPresenter 的值,但只有一次 - 它不会在选择更改时更新值。
如何强制 Path.Fill 属性 像 TextBlock 一样更新它的颜色?
在 ControlTemplate
中,"templated parent" 是控件本身,因此将自定义控件添加到组合中对您没有任何帮助。
您可能想要的是这个。我无法在此处的 UWP 中对其进行测试,所以如果您遇到任何错误,请告诉我。
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="Hello" />
<Path
x:Name="MyPath"
Fill="YellowGreen"
Data="M 0,0 L 16,0 L 16,16 L 0,16 Z"
/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}"
Value="True">
<Setter
TargetName="MyPath"
Property="Fill"
Value="{Binding SelectedForeground, RelativeSource={RelativeSource AncestorType=ListView}}"
/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>
您可以直接在 listView 的项模板中使用 relativeSource。
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Width="24"
Height="24"
Fill="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>
<TextBlock Text="{Binding}"
x:Name="TitleBlock"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>