我尝试了关于拉伸的建议here,但它对我不起作用。
我有一个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>
任何人都可以解释为什么这不会自动调整大小,以及如何解决这个问题?我是否必须编写自己的自定义面板来处理此问题,并使用MeasureOverride
和Arrange
?
答案 0 :(得分:1)
问题在于您使用StackPanels在两个方向上排列项目,因此您将失去任何类型的拉伸。 StackPanel允许其子项仅在与Orientation相反的方向上伸展。另一个方向将只提供所需的空间,以便尽可能多地留出其余项目。因此,对于默认的Vertical StackPanel,您放入的任何内容都会水平拉伸,但会垂直向顶部挤压。由于您在水平StackPanel内部有垂直StackPanel,因此物品会受到两种挤压。
根据您的项目要求,有几个选项。更改为DockPanel将允许最后一个项目拉伸并填充空间(垂直项目需要在ItemContainerStyle中设置DockPanel.Dock = Top)。具有*大小的行和列的网格适用于普通布局,但不适用于ItemsControls,因为需要为每个项目设置行和列(可以使用ItemsControl.AlternationIndex完成,但这是一个痛苦和脆弱)。使用1行/列UniformGrid(如您所引用的答案)将均匀划分可用空间,并且不需要对项目进行任何其他设置。
如果您需要一些更复杂的布局策略,不同的项目会有不同的空间或拉伸行为,您需要一个自定义面板。
答案 1 :(得分:0)
尝试在窗口中设置
SizeToContent="WidthAndHeight"