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

时间:2018-05-23 11:55:25

标签: c# wpf xaml

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

dataLayer

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

enter image description here

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

enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

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