是否有更简单/更好的方法来自动调整单列ListView的内容?

时间:2011-11-25 10:57:10

标签: wpf listview listviewitem autosize

好的,对不起我的英语,在这里我需要的是:

我在 XAML (WPF)中找到了ListView,其中找到了项目,我需要的是宽度等于ListView宽度的项目

到目前为止,我做到了这一点:

<ListView Name="lvFiles" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <Grid Width="{Binding ElementName="lvFiles", Path=ActualWidth}">
                    <!-- All the controls inside I need to present an item -->
                </Grid>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

但事实证明,当出现垂直滚动条时,ListView项目会在右侧被剪裁。并且当所有项目的总高度超过ListView.ActualHeight时出现,因此我需要用户绑定更复杂,因此更复杂。

另外,我的物品,虽然我花了几个小时来解决问题,我的物品有时被剪裁在右边,没有明显的原因。

所以我想出了这个:

<ListView Name="lvFiles" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  <ListView.View>
    <GridView>
      <GridViewColumn Width="{Binding ElementName=lvFiles, Path=ActualWidth}">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <Decorator Width="{Binding RelativeSource={RelativeSource
                           Mode=FindAncestor, AncestorType=ListViewItem},
                           Path=ActualWidth}">

                    <Grid Margin="0,0,18,0">
                        <!-- All the controls inside... -->
                    </Grid>
                </Decorator>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

它解决了剪辑问题,并且它解决了单柱ListViewItem自动调整大小的问题。但现在它似乎不是最简单的方式。有没有这样的?

1 个答案:

答案 0 :(得分:3)

您没有使用标题,因此您可以直接使用ListView而无需使用GridView。至于宽度,请不要调整内容宽度,而是调整ListViewItem宽度。

以下是一个例子:

<Style x:Key="singleListViewItemStyle"
       BasedOn="{StaticResource {x:Type ListViewItem}}"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="Width"
            Value="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type VirtualizingStackPanel}}}" />
</Style> 

如果您没有现有的样式定位ListViewItem或者不想从中继承,则可以删除BasedOn="{StaticResource {x:Type ListViewItem}}"

使用

AncestorType={x:Type VirtualizingStackPanel}是因为默认情况下ListView显示其内容。如果您有自己的ListView主题,请参阅以下示例:

<ListView Name="myListView"
          ItemContainerStyle="{StaticResource ResourceKey=singleListViewItemStyle}"
          ItemsSource="{Binding Path=MyItems}"
          SelectedItem="{Binding Path=MySelectedItem, Mode=TwoWay}"
          SelectionMode="Single">
    <ListView.ItemTemplate>
        <DataTemplate>
            <!--Your favorite controls-->
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

以下是我为您制作的演示项目的link。您还可以看到我的其他控件。

我希望这会有所帮助。