C# 窗口大小调整内容和列表框大小
我试图弄清楚如何将WPF列表框与SizeToContent属性设置为WidthAndHeight的窗口结合使用。主窗口有一个两行两列的网格。在右下象限,我有一个列表框。我希望窗口中的其余控件控制窗口的大小,而列表框只需填充可用空间即可。当前,列表框正在扩展以适应其内容,这会导致整个主窗口扩展 注意:我试图创建一个简单的示例,但想指出的是,在我的实际场景中,我使用的是MVVM,我要确定窗口宽度/高度的控件绑定到viewmodel中的属性,这些属性在加载窗口后设置了值 编辑以添加:列表框在我要确定大小的控件之前绑定到其内容,而我对此没有控制权 以下是主窗口当前在启动时的外观: 注意红色和蓝色的条,它们表示我不想发生的事情。该区域中的内容应仅通过滚动条可见 以下是我希望主窗口在启动时的外观: 请注意,主窗口的大小由顶部和左侧的文本块决定,列表框将填充可用空间并在必要时使用滚动条 下面是一些示例代码 MainWindow.xaml:C# 窗口大小调整内容和列表框大小,c#,wpf,xaml,C#,Wpf,Xaml,我试图弄清楚如何将WPF列表框与SizeToContent属性设置为WidthAndHeight的窗口结合使用。主窗口有一个两行两列的网格。在右下象限,我有一个列表框。我希望窗口中的其余控件控制窗口的大小,而列表框只需填充可用空间即可。当前,列表框正在扩展以适应其内容,这会导致整个主窗口扩展 注意:我试图创建一个简单的示例,但想指出的是,在我的实际场景中,我使用的是MVVM,我要确定窗口宽度/高度的控件绑定到viewmodel中的属性,这些属性在加载窗口后设置了值 编辑以添加:列表框在我要确定大
<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;
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var Messages=newobserveCollection(){“这是一个长字符串,用于证明列表框内容决定窗口宽度”};
对于(int i=0;i<16;i++)
添加(“测试”+i);
对于(int i=0;i<4;i++)
添加(“此文本应仅通过垂直滚动条可见”);
ListBox1.ItemsSource=消息;
}
}
设置列表框ItemsSource,并在加载窗口后设置SizeToContent=Manual
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
SizeToContent = SizeToContent.Manual;
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;
}
public主窗口()
{
初始化组件();
已加载+=已加载;
}
已加载专用void(对象发送方,RoutedEventArgs RoutedEventArgs)
{
SizeToContent=SizeToContent.Manual;
var消息=新的ObservableCollection
{
“这是一个长字符串,用于演示列表”+
“框内容决定窗口宽度”
};
对于(int i=0;i<16;i++)
{
添加(“测试”+i);
}
对于(int i=0;i<4;i++)
{
添加(“此文本应仅通过垂直滚动条可见”);
}
ListBox1.ItemsSource=消息;
}
通过这种方式,主窗口最初会调整大小以适应内容(列表框中没有数据),然后列表框会显示带有滚动条的项目。谢谢您的建议,它确实修复了我的示例。然而,我可能过于简化了我的示例,因为在我的实际场景中,我使用的是MVVM,并且我想要确定窗口宽度/高度的控件绑定到视图模型中的属性,这些属性在加载窗口后设置了值,所以我认为这不会起作用。@Theodge3:将视图模型分成两部分。最初,示例中列表框表示的数据将显示为空。然后在视图模型上设置一个标志,该标志将导致数据可用。据我所知,建议的解决方案需要以下操作顺序:1)我要确定窗口宽度/高度的控件已加载其内容(可能绑定是更好的词?),以便使窗口大小与它们匹配。2) 设置SizeToContent=Manual,使窗口不再自动调整大小。3) 列表框内容已绑定。但是,在我的场景中,列表框在我想要确定大小的控件之前获取其内容集,并且没有简单的方法来更改它。@Theodge3。如果您愿意放弃纯MVVM,那么您可以在适当的时间取消绑定并重新绑定listbox项源代码。