C# 窗口大小调整内容和列表框大小

C# 窗口大小调整内容和列表框大小,c#,wpf,xaml,C#,Wpf,Xaml,我试图弄清楚如何将WPF列表框与SizeToContent属性设置为WidthAndHeight的窗口结合使用。主窗口有一个两行两列的网格。在右下象限,我有一个列表框。我希望窗口中的其余控件控制窗口的大小,而列表框只需填充可用空间即可。当前,列表框正在扩展以适应其内容,这会导致整个主窗口扩展 注意:我试图创建一个简单的示例,但想指出的是,在我的实际场景中,我使用的是MVVM,我要确定窗口宽度/高度的控件绑定到viewmodel中的属性,这些属性在加载窗口后设置了值 编辑以添加:列表框在我要确定大

我试图弄清楚如何将WPF列表框与SizeToContent属性设置为WidthAndHeight的窗口结合使用。主窗口有一个两行两列的网格。在右下象限,我有一个列表框。我希望窗口中的其余控件控制窗口的大小,而列表框只需填充可用空间即可。当前,列表框正在扩展以适应其内容,这会导致整个主窗口扩展

注意:我试图创建一个简单的示例,但想指出的是,在我的实际场景中,我使用的是MVVM,我要确定窗口宽度/高度的控件绑定到viewmodel中的属性,这些属性在加载窗口后设置了值

编辑以添加:列表框在我要确定大小的控件之前绑定到其内容,而我对此没有控制权

以下是主窗口当前在启动时的外观:

注意红色和蓝色的条,它们表示我不想发生的事情。该区域中的内容应仅通过滚动条可见

以下是我希望主窗口在启动时的外观:

请注意,主窗口的大小由顶部和左侧的文本块决定,列表框将填充可用空间并在必要时使用滚动条

下面是一些示例代码

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;
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
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项源代码。