我有一个奇怪的问题。我不确定这是不是一个错误,或者我只是误解了一些东西,因为我对WPF很新(可能是后者)。
在我的项目中,我有一个ListView
,它以与使用Icon视图的Windows资源管理器相似的方式显示项目。我概述了一个控件模板,该模板由一个Image
元素和一个TextBlock
元素组成。我的目标是在选择TextBlock
时调整ListViewItem
的最大高度。这样,项目的名称将从用省略号修剪到显示项目的全名进行调整。
然而,当选择该项目时,它不会调整 的最大高度 所选项TextBlock
,而是调整全部{{无论是否主动选择,每个项目都有1}}。
我已经研究过一个答案,但没有找到与此特定问题相似的内容。这个链接是一个类似的概念,但没有我的问题。
WPF - ListView Item on Selected change Font size
我的其他一些方法包括一个TextBlock
带有风格更改的触发器,或者ControlTemplate
而不是明确的ItemContainerStyle
,这些都似乎给出了相同的不良结果。
如何实现此功能?可以使用ControlTemplate
吗?
以下是我的一些XAML代码:
的ListView
ControlTemplate
CONTROLTEMPLATES
<ListView x:Name="ItemViewer">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Margin="10"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Margin" Value="10"/>
<Setter Property="Template" Value="{StaticResource ListViewItemNormal}"/>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource ListViewItemSelected}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
修改
以下是ms_dos实施的问题示例。
答案 0 :(得分:0)
您不需要两个单独的控制模板。只需获取ItemContainerStyle
的{{1}}属性,然后使用如下控件模板:
ListView
查看<ListView x:Name="ItemViewer">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Margin="10" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border x:Name="ItemBoxBorder"
Background="Green"
BorderThickness="1"
VerticalAlignment="Top">
<Grid HorizontalAlignment="Left"
MinHeight="90"
Margin="5"
MaxWidth="90"
Width="90"
x:Name="ItemBox">
<StackPanel>
<Image HorizontalAlignment="Center"
VerticalAlignment="Top"
Width="64"
Height="64" />
<TextBlock x:Name="ItemDescription"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
TextWrapping="Wrap"
Text="{Binding}"
MaxWidth="90"
MaxHeight="125"
TextTrimming="CharacterEllipsis" />
</StackPanel>
<Grid.ToolTip>
<ToolTip Content="{Binding Path=Name}" />
</Grid.ToolTip>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected"
Value="true">
<Setter TargetName="ItemBoxBorder"
Property="Background"
Value="Red" />
<Setter TargetName="ItemDescription"
Property="TextElement.FontSize"
Value="20" />
<Setter TargetName="ItemBoxBorder"
Property="Height"
Value="135" />
</Trigger>
<Trigger Property="IsSelected"
Value="false">
<Setter TargetName="ItemBoxBorder"
Property="Height"
Value="90" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
部分。基本上你使用ControlTemplate.Triggers
属性来控制触发器应该处理哪个属性......在我们的例子中是ListView的Trigger
。使用IsSelected
,您可以定义属性以及Setter
控件更改的值。 ListViewItem
的{{1}}是指您在TargetName
部分中定义的控件的Setter
。
我希望这个例子可以帮助您解决问题!
电贺 MS_DOS