WPF:如何使ListViewItems适应窗口宽度并使用TextEllipsis

4
我目前正在使用ListView。它的ListViewItems由左对齐的TextBlock和右对齐的Button组成:
The ListView in an uncomplicated state.
现在,我希望我的Items始终显示按钮,并相应缩短TextBlock,因此它们不需要显示滚动条:
The ListView's intended behavior.
不幸的是,现在它还不起作用:
The ListView's current behavior.
我该怎么做才能让它起作用?以下是我的示例代码:
<Window x:Class="JansWpfTestUmgebung.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ListView x:Name="AllItemsList"
              HorizontalContentAlignment="Stretch"
              HorizontalAlignment="Stretch">
        <ListViewItem>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0"
                       TextTrimming="CharacterEllipsis" 
                       Text="Item 1 with a very long description"/>
            <Button Grid.Column="1"
                    Content="Modify" />
        </Grid>
    </ListViewItem>
        <ListViewItem>Item 2</ListViewItem>
        <ListViewItem>Item 3</ListViewItem>
    </ListView>
</Window>

感谢任何提示!:-)
2个回答

4
您可以通过强制规定按钮列的大小来实现此操作:
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" 
        x:Class="JansWpfTestUmgebung.MainWindow"
        d:DesignWidth="394">
    <ListView x:Name="AllItemsList"
              HorizontalContentAlignment="Stretch"
              HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListViewItem>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="45" />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0"
                TextTrimming="CharacterEllipsis" 
                Text="Item 1 with a very long description"/>
            <Button Grid.Column="1"
                    Content="Modify"/>
        </Grid>
    </ListViewItem>
        <ListViewItem Content="Item 2"/>
        <ListViewItem Content="Item 3"/>
    </ListView>
</Window>

原本的方式是,它会尽力保持 * 大小的列尽可能大,以牺牲自动大小的列为代价。但固定大小的列会胜过 * 大小的列。


非常感谢!你的代码对我很有效。有趣的是,它似乎不仅是按钮列的固定宽度,还包括你添加的显式禁用滚动条。再次感谢 :-) - Jan
啊,没问题。<S>很高兴能帮到你。 - CodeWarrior

1
最重要的部分是这些。
<ListView HorizontalContentAlignment="Stretch"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

那样,您的ListViewItems将填充空间,并且禁用水平滚动条将防止它们占用更多空间。
我的代码如下:
<ListView HorizontalContentAlignment="Stretch"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          ItemsSource="{Binding MyItemSourceList}"
          Width="{Binding ActualWidth, ElementName=SearchBox}"
          >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" 
                               Text="{Binding Name}" 
                               TextTrimming="CharacterEllipsis"/>
                    <TextBlock Grid.Column="1" 
                               Text="{Binding Tag}" 
                               HorizontalAlignment="Right" 
                               FontWeight="Bold" 
                               Foreground="LightGray"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
</ListView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接