2015-09-22 4 views
1

У меня есть ItemsControl, который отображает кучу UserControl внутри WrapPanel. Это работает отлично, если у меня нет кучи UserControls, а затем переполнение отображается за пределами экрана, и я не могу получить к нему доступ. Моя цель состоит в том, чтобы обернуть WrapPanel горизонтально, но как только элементы управления отключены от экрана, чтобы отобразить полосу прокрутки, и это, похоже, не работает для меня.A WPF ItemsControl и 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 выполняет свою работу, но он отображается за пределами окна.

User Controls off the screen

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

Expanded window to see all controls, rather than a scrollbar

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

Полный 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> 
+1

Я не уверен, какое реальное поведение вы ожидаете - возможно, вы могли бы точно определить, что хотите? Если вы поместите панель обертки в средство просмотра прокрутки, то она больше не будет работать как панель обертки, потому что средство просмотра прокрутки имеет бесконечные размеры. В этом случае вы можете просто использовать панель стека. Опять скажите мне, что вы хотите, и я могу дать вам некоторые идеи/советы. :) – user3690202

+1

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

+1

Итак, вы хотите обернуть по горизонтали, но когда он достигнет дна, вы хотите прокрутить вертикально? – user3690202

ответ

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.

+0

ЭТО ТОЧНО ЧТО Я ХОЧУ !!! Большое вам спасибо @Laith –

+0

Я по-прежнему считаю, что чистильщик должен помещать просмотрщик прокрутки за пределы сетки и оставлять строку в качестве авто - но что бы ни плавало на вашей лодке – user3690202

+0

Вам тоже нужен ScrollViewer. –

3
<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.Template> 
     <ControlTemplate TargetType="{x:Type ItemsControl}"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ItemsPresenter /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 

ИЛИ

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <ItemsControl ItemsSource="{Binding Servers, Mode=OneWay}"> 
    ... 
    <ItemsControl/> 
</ScrollViewer> 
+0

Я пробовал оба из них, но ни один из них не будет работать. –

+0

@ DanChampagne Первая часть этого ответа не имеет смысла, но вторая часть должна работать. Попробуйте удалить локальный сервер ServerControl и придать Border фиксированную ширину и высоту. Это действительно должно работать - я скопировал и вставил ваш код, закомментировал ServerControl, поместил в ScrollViewer, и он работает ... – user3690202

+0

@ user3690202 Я добавил пару отпечатков на сообщение, чтобы показать, что я вижу. Ни одно из этих предложений на самом деле не дает мне поведенческого поведения. Оба требуют, чтобы я расширил окно, вместо того, чтобы предоставить мне пользовательский ScrollBar. –

Смежные вопросы