WPF ItemsControl и WrapPanel влизат в бар

Имам ItemsControl, който показва куп UserControl вътре в WrapPanel. Това работи перфектно, освен ако нямам куп потребителски контроли и тогава препълването се изобразява извън екрана и нямам достъп до него. Целта ми е 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 върши работата си, но се изобразява извън границите на прозореца.

Потребителски контроли извън екрана

Това показва всички потребителски контроли, но трябваше да разширя прозореца, за да мога да ги видя всички.

Разширен прозорец, за да видите всички контроли, вместо лента за превъртане

Всяка помощ ще бъде високо оценена.

Пълен 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