ListView 样式添加省略号 (...) 到所有截断的文本

问题描述 投票:0回答:1

我想在我的 WPF 应用程序中为我的 ListView 创建样式,这使它们看起来更像 Windows 资源管理器 ListView。我坚持的是当列太窄无法修复文本时出现在网格/详细信息视图中的省略号 (...)。

知道 我可以覆盖每列的单元格模板,并显式设置

TextTrimming
模式以在每列的基础上获得省略号。但是,我想要一种可以应用于任何 ListView 以获得相同行为的样式。

我希望能够像这样定义列表视图:

<ListView ItemsSource="{Binding Library}" Style="{StaticResource ExplorerListStyle}">
    <ListView.View>
        <GridView>
           <GridViewColumn Width="90" Header="Title" DisplayMemberBinding="{Binding Title}" />
           <GridViewColumn Width="60" Header="Author" DisplayMemberBinding="{Binding Author}" />
        </GridView>
    </ListView.View>
</ListView>

我还希望能够覆盖某些列的单元格模板,例如设置文本颜色,理想情况下,同时仍然继承模板中文本的

TextTrimming
模式。

到目前为止,我设法实现这一点的唯一方法是显式覆盖 ListView 中的 TextBlock 样式:

<ListView ItemsSource="{Binding Library}">
    <ListView.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="TextTrimming" Value="CharacterEllipsis" />
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
           <GridViewColumn Width="90" Header="Title" DisplayMemberBinding="{Binding Title}" />
           <GridViewColumn Width="60" Header="Author" DisplayMemberBinding="{Binding Author}" />
        </GridView>
    </ListView.View>
</ListView>

但是,这似乎有点笨拙,据我所知,不可能将其设置为样式。

所以,我正在寻找另一种方法来为

GridViewColumn
s 标题和单元格设置 TextTrimming 模式,can 设置为样式,并且 doesn't 需要明确的
CellTemplate
s.

谢谢,

马克

wpf xaml listview styles ellipsis
1个回答
0
投票

好吧,我想到了一个超级 hacky 的方法来做到这一点。我是个新手,所以我确信这可以改进,但是......我在样式中设置了 ListView 的模板,然后在该模板内的第一个 Border 元素上我添加了一个 Loaded 事件,然后在Loaded 事件我构建了 TextTrimming TextBlock 样式并将其添加到 ListView 的资源中,代码如下:

private void ListView_Loaded(object sender, RoutedEventArgs e)
{
    var ListViewTextBlockStyle = new Style
    {
        TargetType = typeof(TextBlock)
    };

    ListViewTextBlockStyle.Setters.Add(new Setter(TextBlock.TextTrimmingProperty, TextTrimming.CharacterEllipsis));

    ListView listView = (ListView)VisualTreeHelper.GetParent((Border)sender);

    listView.Resources.Add(typeof(TextBlock), ListViewTextBlockStyle);
}

注意这里是针对border,使用VisualTreeHelper获取父ListView;我没有看到将事件直接从样式添加到 ListView 的方法(也许有,但我知道)所以我不得不在边框上搭载。另请注意,如果您直接在 XAML 中添加

<ListViewItem>
s,它不起作用,当您指定 ItemsSource 并将 GridViewColumns 绑定到该源元素中的属性时,它会起作用。

就像我说的,非常hacky,但它确实有效。

© www.soinside.com 2019 - 2024. All rights reserved.