ListView样式,用于将省略号(..)添加到所有截断的文本中



我想在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的标头和单元格的TextTrimming模式,即可以在样式中设置,不需要显式CellTemplate

谢谢,

标记

好吧,我想到了一种非常巧妙的方法。我是一个新手,所以我相信这是可以改进的,但是。。。我在Style中设置了ListView的Template,然后在该模板中的第一个Border元素上添加了Loaded事件,在该Loaded事件中,我构建了TextTrimming TextBlock样式,并将其添加到ListView的Resources中,代码如下:

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);
}

请注意,这将以边界为目标,并使用VisualTreeHelper获取父ListView;我看不到从Style直接将事件添加到ListView的方法(也许有,但idk),所以我不得不利用边界。另外请注意,如果您在XAML中直接添加<ListViewItem> s,则它不起作用;当您指定ItemsSource并将GridViewColumns绑定到该源元素中的属性时,它起作用。

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

相关内容

  • 没有找到相关文章

最新更新