我有一个ListView,用户可以在其中添加文件。 ListView下面有两个按钮,用于添加单个文件或整个文件目录。代码结构类似于:
<StackPanel>
<ListView>...</ListView>
<StackPanel>
<Button Content="Add Scan"/>
<Button Content="Add mulit"/>
</StackPanel>
</StackPanel>
这很有效,直到文件数超过可用空间:
但是,当文件多于可用空间时,TreeView会显示滚动条,但带有按钮的堆栈面会消失:
我想问题是包含TreeView和其他StackPanel的StackPanel允许子元素在可用大小之外增长。如果我用网格替换StackPanel,当有很多文件时我会得到所需的行为,但是当文件较少(或根本没有文件)时,按钮会卡在底部:
我可以使用哪种面板组合来让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();
}
}
}