Элементы управления WPF ItemsControl и WrapPanel входят в панель

У меня есть ItemsControl, который отображает кучу UserControl внутри WrapPanel. Это работает отлично, если у меня нет группы UserControls, а затем переполнение отображается за пределами экрана, и я не могу получить к нему доступ. Моя цель состоит в том, чтобы обернуть WrapPanel по горизонтали, но как только элементы управления не отображаются на экране, чтобы отобразить полосу прокрутки, и это, похоже, не работает для меня.

<ItemsControl ItemsSource="{Binding Servers, Mode=OneWay}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Black" BorderThickness="1" Margin="5,5,5,5">
                <local:ServerControl DataContext="{Binding }" /> <!-- The actual UserControl -->
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Вот как это выглядит при первом запуске приложения. Чего вы не видите, если это должно быть просмотрено 14 ящиков. WrapPanel выполняет свою работу, но отображается за пределами окна.

Элементы управления пользователя за экраном

Здесь показаны все элементы управления UserControl, но мне пришлось развернуть окно, чтобы увидеть их все.

Расширенное окно для просмотра всех элементов управления, а не полоса прокрутки

Любая помощь будет принята с благодарностью.

Полный XAML:

<Window x:Class="ServerMonitor.Wpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ServerMonitor.Wpf"
        xmlns:models="clr-namespace:ServerMonitor.Wpf.Models"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        Title="Leading Hedge Server Monitor" Height="350" Width="800">
    <Window.DataContext>
        <models:MainWindowViewModel>
            <models:MainWindowViewModel.MachineNames>
                <!-- Test Servers -->
                <System:String>T009</System:String>
                <System:String>T010</System:String>
                <System:String>T011</System:String>
                <System:String>T012</System:String>
            </models:MainWindowViewModel.MachineNames>
        </models:MainWindowViewModel>
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Menu Grid.Row="0">

        </Menu>

        <ItemsControl Grid.Row="1" ItemsSource="{Binding Servers, Mode=OneWay}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Black" BorderThickness="1" Margin="5,5,5,5">
                        <local:ServerControl DataContext="{Binding }" />
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.Template>
                <ControlTemplate TargetType="{x:Type ItemsControl}">
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
        </ItemsControl>

    </Grid>
</Window>

person Dan Champagne    schedule 22.09.2015    source источник
comment
Я не уверен, какого реального поведения вы ожидаете - возможно, вы могли бы подробно описать, что хотите? Если вы поместите панель обтекания в средство просмотра прокрутки, она больше не будет работать как панель обтекания, потому что средство просмотра прокрутки имеет бесконечные размеры. В этом случае вы можете просто использовать панель стека. Опять же, скажите мне, что вы хотите, и я, возможно, дам вам несколько идей / советов. :)   -  person user3690202    schedule 23.09.2015
comment
Извините, цель состоит в том, чтобы элементы управления обертывались как панель обтекания, но если элементы управления выходят за пределы самого окна, активировать полосу прокрутки, чтобы мне не нужно было изменять размер всего окна, чтобы все увидеть.   -  person Dan Champagne    schedule 23.09.2015
comment
Итак, вы хотите обернуть по горизонтали, но когда он достигнет дна, вы хотите прокрутить по вертикали?   -  person user3690202    schedule 23.09.2015
comment
Правильный! Это то, чего я пытаюсь достичь. Мое разочарование, по-видимому, ограничивает мой словарный запас. :)   -  person Dan Champagne    schedule 23.09.2015
comment
В таком случае я думаю, что вторая половина ответа Мойзеса - это то, что вам нужно.   -  person user3690202    schedule 23.09.2015
comment
Я уже пробовал оба его предложения, и ни один из них не работает.   -  person Dan Champagne    schedule 23.09.2015


Ответы (2)


Измените высоту второй строки на *

<Grid.RowDefinitions>
   <RowDefinition Height="Auto" />
   <RowDefinition Height="*" /> <-- This is what you want -->
   <RowDefinition Height="Auto" />
   <RowDefinition Height="Auto" />
</Grid.RowDefinitions>

Установка RowDefinition в Auto означает, что он будет вычислять совокупное DesiredHeight всех дочерних элементов в этой строке и назначать его свойству Height RowDefinition. Итак, по мере роста вашего WrapPanel он будет применять высоту к этой строке и растягивать ваш родительский Grid.

person Laith    schedule 22.09.2015
comment
Я все еще думаю, что чище было бы поместить средство просмотра прокрутки за пределы сетки и оставить строку как автоматическую, но все, что плавает ваша лодка - person user3690202; 23.09.2015
comment
Вам также понадобится ScrollViewer. - person Moises Alexander Salazar Vila; 23.09.2015

person    schedule
comment
@DanChampagne Первая часть этого ответа не имеет смысла, но вторая часть должна работать. Попробуйте удалить свой local: ServerControl и дать Border фиксированную ширину и высоту. Это действительно должно работать - я скопировал и вставил ваш код, закомментировал ServerControl, вставил ScrollViewer, и он действительно работает ... - person user3690202; 23.09.2015
comment
@ user3690202 Я добавил к посту пару распечаток, чтобы показать, что я вижу. Ни одно из этих предложений на самом деле не дает мне того поведения, которое мне нужно. Оба требуют от меня расширения окна, а не предоставления полезной полосы прокрутки. - person Dan Champagne; 23.09.2015
comment
Это проблема: ‹RowDefinition Height = Auto /› - person Moises Alexander Salazar Vila; 23.09.2015