gpt4 book ai didi

c# - 列表框、数据模板和触发器

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:57 25 4
gpt4 key购买 nike

我有一个 listboxitem 的数据模板,我想创建一个触发器,所以当用户点击一个项目时,背景和标签都会改变

我的代码:

<Window.Resources>
<Style x:Key="RoundedItem" TargetType="ListBoxItem">
<EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="ItemBorder" CornerRadius="10" BorderBrush="Black" BorderThickness="1" Margin="1" Background="Transparent">
<Label Name="ItemLabel" Foreground="Red" >
<ContentPresenter />
</Label>
</Border>

<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="ItemBorder" Property="Background" Value="DeepSkyBlue" />
<Setter TargetName="ItemLabel" Property="Foreground" Value="Orange" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>

</Setter.Value>
</Setter>
</Style>

<DataTemplate x:Key="TitleTemplate" DataType="models:Title" >
<StackPanel>
<Image Source="{Binding ThumbFilePath}" Width="50" HorizontalAlignment="Center"/>
<Label Content="{Binding Name}" HorizontalAlignment="Center" />
<TextBlock Text="{Binding Description}" HorizontalAlignment="Center" TextWrapping="Wrap" Padding="5,5,5,5"/>
</StackPanel>
</DataTemplate>

</Window.Resources>

发生的事情是 TextBlock 改变了他的颜色而不是标签..

谁知道为什么?谢谢。

最佳答案

TextBlock 从可视化树中的父级继承了前景定义。另一方面,Label 以其默认样式定义前景。

您的方法是“非 WPF 类”- 您不应将 ContentPresenter 包装在 Label 控件中。

正确的方法取决于您是希望项目中的所有文本更改其前景,还是仅更改标签?

[在这两种情况下,在数据模板中使用 Label 没有明显的好处 - 所以我假设标签已更改为 TextBlock .]

如果上述问题的答案是所有文本都应更改:在 ListBoxItemControlTemplate 中,在 IsSelected 的触发器中,从第二个 setter 中删除TargetName="ItemLabel" 所以最终的 setter 是:

<Setter Property="Foreground" Value="Orange" />

这将更改项目的前景,这将影响数据模板中两个 TextBlock 的前景。

如果您只想影响其中一个 TextBlocks:

1. remove the setter for the foreground from the control template
2. add a trigger to your data template:

<DataTemplate>
<StackPanel>
<Image .../>
<TextBlock x:Name="Text01" ..../>
<TextBlock x:Name="Text02" ..../>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
<Setter TargetName="Text01" Property="Foreground" Value="Orange"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>

旁注:如果您必须在数据模板中使用Label 控件,请将其 Foreground 属性绑定(bind)到列表框项目的 Foreground,如下所示:

<Label Foreground="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"....../>

如果这没有帮助,这意味着您的列表框项目继承了它的前景,所以使用:

<Label Foreground="{Binding TextElement.Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"....../>

关于c# - 列表框、数据模板和触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com