WPF ListView 滚动条

17

好的,我放弃了 - 我该如何在列表视图中获得垂直滚动条而不在xaml中指定硬编码的MaxHeight值?

这是我的xaml(我没有包括数据模型,但它基本上是一个目录列表)

<UserControl x:Class="WpfApplication1.Views.FolderViewView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="500" >
<DockPanel>
    <StackPanel DockPanel.Dock="Top">
        <Label Name="lblFolder" Content="{Binding Path=FolderName}" MinWidth="250"/>
        <Button Name="btnFolder" Content="Select Folder" Click="btnFolder_Click" />
    </StackPanel>
    <DockPanel>
        <ListView Name="lstFiles" ItemsSource="{Binding}" Margin="1" MaxHeight="200" Height="Auto" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Filename" DisplayMemberBinding="{Binding Path=FileName}" />
                    <GridViewColumn Header="Extenstion" DisplayMemberBinding="{Binding Path=Extension}" />
                    <GridViewColumn Header="Size" DisplayMemberBinding="{Binding Path=FileSize}" />
                    <GridViewColumn Header="Creation Date" DisplayMemberBinding="{Binding Path=CreateDate}" />
                    <GridViewColumn Header="Modified Date" DisplayMemberBinding="{Binding Path=ModifiedDate}" />
                </GridView>
            </ListView.View>
        </ListView>
    </DockPanel>
</DockPanel>

如果没有在ListView控件上设置MaxHeight属性,则当有足够的项使List view大于屏幕时,滚动条不会出现。 设置MaxHeight="250"后,滚动条就会出现,但是当用户更改窗口大小时,List view不会扩展。

也许我问错了问题,应该是:如何在窗口高度改变时更改listview的最大高度?

请帮帮我,这已经让我烦恼了一整天了...

谢谢

1个回答

21

问题出在使用了 DockPanel。默认情况下,它会将其子元素的所有空间都分配给这些元素(而不考虑可用空间)。

为了解决这个问题,建议您使用 Grid 面板替代 DockPanel

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0">
        <Label Name="lblFolder" Content="{Binding Path=FolderName}" MinWidth="250"/>
        <Button Name="btnFolder" Content="Select Folder" Click="btnFolder_Click" />
    </StackPanel>


    <ListView Grid.Row="1" Name="lstFiles" ItemsSource="{Binding}" Margin="1" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Filename" DisplayMemberBinding="{Binding Path=FileName}" />
                <GridViewColumn Header="Extenstion" DisplayMemberBinding="{Binding Path=Extension}" />
                <GridViewColumn Header="Size" DisplayMemberBinding="{Binding Path=FileSize}" />
                <GridViewColumn Header="Creation Date" DisplayMemberBinding="{Binding Path=CreateDate}" />
                <GridViewColumn Header="Modified Date" DisplayMemberBinding="{Binding Path=ModifiedDate}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

2
抱歉,这对我仍然无效,项目仍会掉落到页面底部,滚动条也不会出现。即使在ListView上明确设置ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"。 - Lee
@Lee - 那么,问题出在包含此UserControl的标记上。您可以将其添加到您的问题中,这样我就可以查看一下吗? - Pavlo Glazkov
1
以下是主机窗口 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <ItemsControl x:Name="itemcontrol" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> </Grid> </Window> - Lee
而这段代码则添加了控件 ` public MainWindow() { InitializeComponent(); Presenters.FolderViewPresenter folderpresenter = new Presenters.FolderViewPresenter(); itemcontrol.Items.Add(folderpresenter.m_View); }` - Lee
1
@Lee - 只需使用ContentPresenter并将其Content属性设置为您的UserControl的实例:contentPresenter.Content = folderpresenter.m_View; 然后您就不需要将其包装在ScrollViewer中。 - Pavlo Glazkov
显示剩余3条评论

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