我正在尝试使用WPF列表框和将SizeToContent属性设置为WidthAndHeight的窗口一起使用。MainWindow有一个带有两行两列的网格,在右下象限中,我有一个列表框。我希望窗口中其余的控件来控制窗口的大小,而列表框只需填充可用空间。目前,列表框正在扩展以适应其内容,这导致整个MainWindow扩展。
注意:我尝试创建了一个简单的示例,但是要指出,在我的真实情况下,我正在使用MVVM,并且要确定窗口宽度/高度的控件绑定到视图模型中的属性,在窗口加载后设置它们的值。
编辑添加:列表框在绑定到其内容之前,我无法控制要确定大小的控件。
以下是MainWindow启动时的当前外观:
请注意红色和蓝色条,这表明我不想发生的事情。该区域中的内容仅通过滚动条可见。
以下是我希望MainWindow在启动时的外观:
请注意,MainWindow的大小由顶部和左侧的文本块确定,列表框填充可用空间并在必要时使用滚动条。
以下是一些示例代码...
MainWindow.xaml:
注意:我尝试创建了一个简单的示例,但是要指出,在我的真实情况下,我正在使用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;
}
}