WPF问题中的垂直大小调整

Posted

技术标签:

【中文标题】WPF问题中的垂直大小调整【英文标题】:Vertical sizing in WPF trouble 【发布时间】:2014-07-06 13:39:17 【问题描述】:

我在垂直调整 https://wpftoolkit.codeplex.com/ 的 CheckListBox 控件时遇到了问题。我是 WPF 一周大的新手,所以这可能是(垂直)大小调整的一般问题。

考虑到我的网格,我希望前 5 行的大小可以随意调整,在我的视口中,我希望第 6 行中的 CheckListBox 控件可以简单地垂直填充剩余空间。

我的问题是,当我用很多元素填充 CheckListBox 时,控件只会扩展/溢出视口。我想要它做的是垂直假设剩余空间的高度,这将使它显示一个内部滚动条。

<Grid Grid.Column="0">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Label Grid.Row="0">Some title</Label>
    <RadioButton Grid.Row="1" GroupName="NameSortRadioButtonGroup">Firstname Lastname</RadioButton>
    <RadioButton Grid.Row="2" GroupName="NameSortRadioButtonGroup">Lastname, Firstname</RadioButton>
    <TextBox Grid.Row="3" Margin="0,5" />
    <Label Grid.Row="4" Content="Binding ElementName=MyCheckListBox, Path=SelectedItems.Count" />
    <xctk:CheckListBox
        Grid.Row="5"
        Name="MyCheckListBox"
        VerticalAlignment="Stretch"
        VerticalContentAlignment="Stretch"
        Height="Auto"
        />
</Grid>

为了简化,我省略了一些父元素。 Grid 在网格中,在画布中,在网格中,并且这个外部网格是 Window 元素的直接子元素。

我已尝试将 CheckListBox 控件包装在 StackPanel 中,使用 Height="Auto"(以消除 CheckListBox 中出现错误的可能性),并在此处设置 CheckListBox 的高度使用

Height="Binding ElementName=CheckListBoxStackPanelWrapper, Path=ActualHeight"

我最初也尝试使用 StackPanel 和后来的 DockPanel 而不是 Grid 控件来完成整个操作。

在所有情况下,CheckListBox 只是从窗口/视口中流出。如果我给它一个明确的高度,它的行为是正确的,但我显然希望我的窗口可以调整大小。

我该怎么办?

【问题讨论】:

这个Grid 是直接在您的Window 中还是其他一些控件的一部分? 还有更多的东西 - 它在网格中,在网格中,在画布中。这个画布的大小是“内容区域”,实际上就是我所说的视口。 Canvas 是问题所在。来自MSDN:Canvas 的子元素总是被赋予他们想要的完整大小。因此,您的Grid 将获得所需的空间 我的好人,你是对的!谢谢。可悲的是,画布在那里只是因为我在乱搞学习控件。我已经把canvas-part放到问题里了,所以你可以正式“回答”,我可以把你的回答标记为答案,你就得分了:) 【参考方案1】:

总结 cmets 因为你的外部控件是一个Canvas,它不限制它的子元素来自MSDN:

Canvas 的子元素总是被赋予他们想要的完整尺寸

这意味着Grid 将获得所需的空间。一种解决方案是删除Canvas 部分或限制Grid 的大小或扩展行

【讨论】:

谢谢。我移除了外部画布,总体上减少了嵌套,现在网格正确地限制了流动。

以上是关于WPF问题中的垂直大小调整的主要内容,如果未能解决你的问题,请参考以下文章

WPF:调整图像大小,但仅在用户调整UI大小时

WPF:如何在弹出窗口中自动调整 WebBrowser 的大小?

调整大小以适合 div 中的图像,并水平和垂直居中

WPF TextBlock 字体调整大小以填充网格中的可用空间

当窗口垂直调整为更小的尺寸时,避免 WPF 状态栏完全折叠

WPF 从下到上调整窗口大小