无法获取ListBox的内容以使用它调整大小

时间:2010-08-04 16:38:03

标签: wpf listbox resize stackpanel itemspaneltemplate

我尝试了关于拉伸的建议here,但它对我不起作用。

我有一个TabItem,它承载一个UserControl,它实际上只是一个带有ItemsPanel的ListBox。 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>

显示StackPanelContents的ListBoxContainer XAML如下所示:

<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>

任何人都可以解释为什么这不会自动调整大小,以及如何解决这个问题?我是否必须编写自己的自定义面板来处理此问题,并使用MeasureOverrideArrange

2 个答案:

答案 0 :(得分:1)

问题在于您使用StackPanels在两个方向上排列项目,因此您将失去任何类型的拉伸。 StackPanel允许其子项仅在与Orientation相反的方向上伸展。另一个方向将只提供所需的空间,以便尽可能多地留出其余项目。因此,对于默认的Vertical StackPanel,您放入的任何内容都会水平拉伸,但会垂直向顶部挤压。由于您在水平StackPanel内部有垂直StackPanel,因此物品会受到两种挤压。

根据您的项目要求,有几个选项。更改为DockPanel将允许最后一个项目拉伸并填充空间(垂直项目需要在ItemContainerStyle中设置DockPanel.Dock = Top)。具有*大小的行和列的网格适用于普通布局,但不适用于ItemsControls,因为需要为每个项目设置行和列(可以使用ItemsControl.AlternationIndex完成,但这是一个痛苦和脆弱)。使用1行/列UniformGrid(如您所引用的答案)将均匀划分可用空间,并且不需要对项目进行任何其他设置。

如果您需要一些更复杂的布局策略,不同的项目会有不同的空间或拉伸行为,您需要一个自定义面板。

答案 1 :(得分:0)

尝试在窗口中设置

    SizeToContent="WidthAndHeight"