2010-08-04 2 views
0

Я попробовал предложение here относительно растяжки, но это не сработало для меня.Проблемы с получением содержимого ListBox для его изменения размера

У меня есть TabItem, в котором размещается UserControl, который по существу является только ListBox с помощью ItemsPanel. Элемент ItemsPanel заставляет ListBox отображать его содержимое по горизонтали. Содержимое ListBox представляет собой привязку данных к ObservableCollection<StackPanelContents>, что является еще одним UserControl. StackPanelContents сам по себе просто содержит List объектов с некоторым визуальным представлением (они содержат UIElement для визуализации).

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

Вот краткий обзор того, что иерархия классов выглядит следующим образом:

alt text

И вот результаты:

alt text

Часть XAML для главного окна просто имеет TabControl и TabItem:

<Window x:Class="ResizeStackPanelInListBox.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <TabControl> 
     <TabItem Header="Test" x:Name="MyTabItem"> 
      <!-- contents are set in code behind --> 
     </TabItem> 
    </TabControl> 
</Window> 

ListBoxContainer XAML, который отображает StackPanelContents выглядит следующим образом:

<UserControl x:Class="ResizeStackPanelInListBox.ListBoxContainer" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="Auto" Width="Auto"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <TextBlock>ListBox with StackPanels as its ListBoxItems:</TextBlock> 
     <ListBox Grid.Row="1" ItemsSource="{Binding StackPanels}" HorizontalContentAlignment="Stretch"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" Width="Auto" Height="Auto" /> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
     </ListBox> 
    </Grid> 
</UserControl> 

И StackPanelContents UserControl выглядит следующим образом:

<UserControl x:Class="ResizeStackPanelInListBox.StackPanelContents" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="Auto" Width="Auto"> 

    <StackPanel> 
     <TextBlock Text="StackPanel"></TextBlock> 
     <StackPanel x:Name="MyStackPanel"> 
     </StackPanel> 
    </StackPanel> 
</UserControl> 

Может кто-нибудь объяснить, почему это не изменение размера автоматически, и как я могу Подумайте об этом? Должен ли я написать свою собственную панель, чтобы справиться с этим, и использовать MeasureOverride и Arrange?

+0

Возможный дубликат [Проблемы форматирования WPF - автоматическое растяжение и изменение размера?] (Http://stackoverflow.com/questions/2853148/wpf-formatting-issues-automatically-stretching-and-resizing) – Dave

ответ

1

Проблема заключается в том, что вы используете StackPanels расположить элементы в обоих направлениях, так вы теряете какую-либо растяжения. StackPanel позволяет своим детям растягиваться только в направлении, противоположном Ориентации. В другом направлении будет предоставлено столько места, сколько потребуется, чтобы позволить остальным предметам максимально использовать пространство. Поэтому для вертикальной StackPanel по умолчанию все, что вы помещаете внутри, будет растягиваться горизонтально, но сжиматься в направлении вверх по вертикали. Поскольку у вас есть вертикальные стоп-панели внутри горизонтальной StackPanel, вы получаете предметы в обоих направлениях.

Есть несколько вариантов в зависимости от того, что вы хотите, чтобы ваши предметы делали. Переход на DockPanel позволит последнему элементу растягиваться и заполнять пробел (для вертикального нужно установить DockPanel.Dock = Top в ItemContainerStyle). Сетка с строками и столбцами размером * отлично подходит для обычных макетов, но не в случае ItemsControls, так как для каждого элемента необходимо установить строку и столбец (это можно сделать с помощью ItemsControl.AlternationIndex, но это боль и хрупкость). Использование 1 строки/столбца UniformGrid (как в ответе, на которое вы ссылаетесь) равномерно разделит доступное пространство и не потребует каких-либо дополнительных настроек для элементов.

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

+0

В итоге я использовал UniformGrid, и это полностью сработало. Я только хотел горизонтального изменения размера, а не вертикального, поскольку я искал одинаково высокие элементы в моем UserControl ... Спасибо за советы о StackPanel, хотя! – Dave

0

попробуйте установить в окне

SizeToContent="WidthAndHeight" 
Смежные вопросы