C# DockPanel-拉伸控件以填充与其可见性相关的剩余空间

C# DockPanel-拉伸控件以填充与其可见性相关的剩余空间,c#,wpf,xaml,dockpanel,C#,Wpf,Xaml,Dockpanel,以下代码段生成此结果: <DockPanel Width="240"> <ComboBox HorizontalAlignment="Stretch"> <ComboBoxItem Content="A" /> <ComboBoxItem Content="B" /> <ComboBoxItem Content="C" /> </ComboBox> </D

以下代码段生成此结果:

<DockPanel Width="240">
    <ComboBox HorizontalAlignment="Stretch">
        <ComboBoxItem Content="A" />
        <ComboBoxItem Content="B" />
        <ComboBoxItem Content="C" />
    </ComboBox>
</DockPanel>
我们刚刚遇到了第一个问题:组合框不应该填充DockPanel的其他120个像素吗?因为它的HorizontalAlignment=Stretch,而且StackPanel使用其他120个像素

至少,如果我们将StackPanel.Visibility设置为隐藏/折叠,我们会有以下情况:

<StackPanel Orientation="Horizontal" Width="120" Visibility="Visible" Background="Aqua">
    <TextBox Width="60" />
    <TextBox Width="60" />
</StackPanel>
当StackPanel.Visibility隐藏/折叠时,如何使组合框水平填充整个DockPanel.Width,就像第一个图像一样


所有控件都必须水平对齐,并且DockPanel不是实现这一点的必备工具。

如果我了解您的情况,那么网格组件似乎是一个不错的选择

关于空间问题: Visibility=Hidden使原始零部件空间保持活动状态,如果可能,请使用Visibility=Collapsed

我们刚刚遇到了第一个问题:组合框不应该填充DockPanel的其他120个像素吗?因为它的HorizontalAlignment=Stretch,而且StackPanel使用其他120个像素

仅当它是DockPanel的最后一个子级时:

顺便说一下,没有理由显式地将HorizontalAlignment属性设置为Stretch。这是默认值

当StackPanel.Visibility隐藏/折叠时,如何使组合框水平填充整个DockPanel.Width,就像第一个图像一样


根据上述示例标记将组合框添加为最后一个子项。

使用可见性。折叠而不是隐藏。@DaveM您是否尝试过使用解决方案运行示例?隐藏或折叠都不起作用。将组合框作为堆栈面板后dock面板中的最后一项,并设置堆栈面板的DockPanel。dock=“Right”DockPanel似乎很方便。在实践中,让事情按预期运行可能会很麻烦,布局也可能很脆弱。网格更容易预测。但是当StackPanel隐藏/折叠时,组合框不会占用第2列的空间。我刚刚测试了它,正如我所写的,Visibility=hidden不起作用,但是当Visibility=Collapse时,组合框会占用整个剩余空间240px。请再次检查,如果您折叠stackpanel,它将不占用空间,并且它位于自动列中,而自动列将不占用空间。如果你只是把它藏起来,它会占用同样的空间,但是你看不见它。在我看来,这样做是可行的。如果由于某种原因,折叠不起作用,那么请使用足够的代码和标记更新您的帖子,以便我们可以轻松复制您看到的内容。
 <Grid Width="240">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <ComboBox HorizontalAlignment="Stretch">
            <ComboBoxItem Content="A" />
            <ComboBoxItem Content="B" />
            <ComboBoxItem Content="C" />
        </ComboBox>
        <StackPanel  Grid.Column="1" Orientation="Horizontal"  Visibility="Visible" Background="Red">
            <TextBox Width="60" />
            <TextBox Width="60" />
        </StackPanel>
    </Grid>
<DockPanel Width="240">
    <StackPanel Orientation="Horizontal" Width="120" Visibility="Visible" Background="Aqua"
                DockPanel.Dock="Right">
        <TextBox Width="60" />
        <TextBox Width="60" />
    </StackPanel>
    <ComboBox>
        <ComboBoxItem Content="A" />
        <ComboBoxItem Content="B" />
        <ComboBoxItem Content="C" />
    </ComboBox>
</DockPanel>