调整选定的ListViewItem TextBlock样式

时间:2016-03-12 01:49:13

标签: c# .net wpf xaml

我有一个奇怪的问题。我不确定这是不是一个错误,或者我只是误解了一些东西,因为我对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实施的问题示例。

This image shows I have the item with a short description selected. This is the height all items should remain if they are not selected.

In this image, you'll see the item with the long description is selected. However, both items extend their height, but only the selected one should grow.

1 个答案:

答案 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