我试图弄清楚如何将 WPF 列表框与 SizeToContent 属性设置为 WidthAndHeight 的窗口结合使用。MainWindow 有一个两行两列的网格。在右下象限,我有一个列表框。我希望窗口中的其余控件来控制窗口的大小,并让列表框简单地填充可用空间。目前,列表框正在扩展以适应其内容,这会导致整个 MainWindow 扩展。
注意:我试图创建一个简单的示例,但想指出,在我的真实场景中,我使用的是 MVVM,并且我想要确定窗口宽度/高度的控件绑定到具有其值的视图模型中的属性加载窗口后设置。
编辑添加:列表框在我要确定大小的控件之前绑定到其内容,我无法控制它。
这是 MainWindow 当前在启动时的样子:
请注意红色和蓝色条,它们表示我不希望发生的事情。该区域中的内容只能通过滚动条可见。
这是我希望 MainWindow 在启动时的样子:
请注意,MainWindow 的大小由顶部和左侧的文本块确定,列表框填充可用空间并在必要时使用滚动条。
这是一些示例代码...
MainWindow.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" SizeToContent="WidthAndHeight">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="The window should fit to the width of this" FontSize="15"/>
<Canvas Background="Red" Grid.Column="1"/>
</Grid>
<Grid Grid.Row="1" Grid.RowSpan="2">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="The window should fit to the height of this" FontSize="15">
<TextBlock.LayoutTransform>
<RotateTransform Angle="-90"/>
</TextBlock.LayoutTransform>
</TextBlock>
<Canvas Background="Blue" Grid.Row="1"/>
</Grid>
<Grid Grid.Row="2" Grid.Column="1">
<ListBox Name="ListBox1">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var Messages = new ObservableCollection<string>() { "This is a long string to demonstrate that the list box content is determining window width" };
for (int i = 0; i < 16; i++)
Messages.Add("Test" + i);
for (int i = 0; i < 4; i++)
Messages.Add("this text should be visible by vertical scrollbars only");
ListBox1.ItemsSource = Messages;
}
}