ListView下面的WPF按钮 - 当ListView太大时消失

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ListView下面的WPF按钮 - 当ListView太大时消失相关的知识,希望对你有一定的参考价值。

我有一个ListView,用户可以在其中添加文件。 ListView下面有两个按钮,用于添加单个文件或整个文件目录。代码结构类似于:

<StackPanel>
    <ListView>...</ListView>
    <StackPanel>
        <Button Content="Add Scan"/>
        <Button Content="Add mulit"/>
    </StackPanel>
</StackPanel>

这很有效,直到文件数超过可用空间:

enter image description here

但是,当文件多于可用空间时,TreeView会显示滚动条,但带有按钮的堆栈面会消失:

enter image description here

我想问题是包含TreeView和其他StackPanel的StackPanel允许子元素在可用大小之外增长。如果我用网格替换StackPanel,当有很多文件时我会得到所需的行为,但是当文件较少(或根本没有文件)时,按钮会卡在底部:

enter image description here

我可以使用哪种面板组合来让StackPanel与两个按钮位于TreeView正下方,除非TreeView占用所有空间,在这种情况下我希望按钮在窗口底部可见,并且TreeView有一个滚动条。

答案

如果您不想占用列表/树下面的整个空间,请尝试以下操作:

<Grid Name="MainGrid">
    <Grid.Resources>
        <local:SubstractorConverter x:Key="SubstractorConverter"/>
    </Grid.Resources>
    <StackPanel>
        <ListView>
            <ListView.MaxHeight>
                <MultiBinding Converter="{StaticResource SubstractorConverter}">
                    <Binding Path="ActualHeight" ElementName="MainGrid" />
                    <Binding Path="ActualHeight" ElementName="Footer" />
                </MultiBinding>
            </ListView.MaxHeight>
        </ListView>
        <StackPanel Name="Footer">
            <Button Content="Add Scan"/>
            <Button Content="Add mulit"/>
        </StackPanel>
    </StackPanel>
</Grid>

这是转换器:

using System;
using System.Globalization;
using System.Linq;
using System.Windows.Data;

namespace TestWpf
{
    class SubstractorConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            var dbls = values.OfType<double>().ToArray();
            if (dbls.Length != 2)
                return null;

            return dbls[0] - dbls[1];
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

以上是关于ListView下面的WPF按钮 - 当ListView太大时消失的主要内容,如果未能解决你的问题,请参考以下文章

从ArrayAdapter每毫秒更新Android ListView中的一行

WPF ListView在运行时不更新

C# wpf listview 如何得到按钮所在行?

QML ListView Loader 不需要的预定义行为

WPF 有一个按钮,当鼠标移动到按钮上面的时候按钮的颜色变为红色,使用Style实现

C#:Caliburn Micro:如何使用数据绑定控制 WPF 按钮的属性?