0

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

我有一个 TabItem,它承载一个 UserControl,它本质上只是一个带有 ItemsPanel 的 ListBox。ItemsPanel 强制 ListBox 水平显示其内容。ListBox 的内容数据绑定到ObservableCollection<StackPanelContents>另一个 UserControl。 StackPanelContents它本身基本上只包含一个List具有一些视觉表示的对象(它们包含一个用于可视化的 UIElement)。

一般来说,代码可以正常工作,因为它呈现了我在 中包含的所有数据ObservableCollection,但问题是项目不会随着窗口的放大或缩小而调整大小。

以下是类层次结构的概述:

替代文字

结果如下:

替代文字

主窗口的 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>

谁能解释为什么这不会自动调整大小,以及我该如何解决这个问题?我是否必须编写自己的自定义面板来处理这个问题,并使用MeasureOverrideand Arrange

4

2 回答 2

1

问题是您正在使用 StackPanels 在两个方向上排列项目,因此您失去了任何形式的拉伸。StackPanel 允许其子级仅在与方向相反的方向上拉伸。另一个方向将仅提供所需的空间,以便为其余项目提供尽可能多的空间。因此,对于默认的 Vertical StackPanel,您放入的任何内容都会水平拉伸,但会垂直挤压到顶部。由于您在 Horizo​​ntal StackPanel 中有 Vertical StackPanels,因此您的项目正被双向挤压。

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

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

于 2010-08-04T18:39:10.423 回答
0

尝试在窗口中设置

    SizeToContent="WidthAndHeight"
于 2010-08-04T17:25:54.403 回答