Кнопки WPF под ListView - исчезают, когда ListView слишком большой - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 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

Я думаю,проблема заключается в том, что StackPanel, который содержит TreeView и другие StackPanel, позволяет дочерним элементам расти за пределами доступного размера.Если я заменю StackPanel на сетку, я получу желаемое поведение, когда файлов много, но когда файлов меньше (или их нет вообще), кнопки застряли внизу:

enter image description here

Любая идея о том, какую комбинацию панелей я могу использовать, чтобы StackPanel с двумя кнопками находился прямо под TreeView, если только TreeView не занимает все пространство, и в этом случае я бы хотелкнопки должны быть видны в нижней части окна, а TreeView иметь полосу прокрутки.

1 Ответ

0 голосов
/ 23 мая 2018

Если вы не хотите занимать все пространство под списком / деревом, попробуйте следующее:

<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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...