Возникли проблемы при получении содержимого ListBox, чтобы изменить его размер - PullRequest
0 голосов
/ 04 августа 2010

Я попробовал предложение здесь относительно растяжения, но у меня оно не сработало.

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

Ответы [ 2 ]

1 голос
/ 04 августа 2010

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

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

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

0 голосов
/ 04 августа 2010

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

    SizeToContent="WidthAndHeight"
...