.net - 强制自定义 WPF 控件正确调整大小

标签 .net wpf user-controls wpf-controls

我编写了一个 WPF 用户控件,其中一部分涉及向 Canvas 动态添加元素,从而影响所述 Canvas 的高度。 Canvas 嵌套在网格内。当我动态添加元素时, Canvas 的高度会发生变化,但 Canvas 最终会延伸到整个控件的边缘之外,而不是导致控件调整大小并使自身更高。 如何强制控件正确调整大小? 我感觉我需要调用或覆盖 Measure 或 Arrange,但我对这两种方法都没有运气 - 可能是因为我使用不正确的参数调用它们,或者可能是因为它们不是要调用的正确方法。

最佳答案

您的问题是 Canvas 面板不会调整大小以适应其内容。

您提到了测量和安排。您熟悉 WPF 的两遍布局系统吗?阅读本文了解更多信息:WPF's Layout System .

本文还介绍了不同面板对布局的作用。每种类型的面板都不同。

在 WPF 中,元素首先有机会确定它们的大小。小组可以根据 child 的体型来确定其尺寸,也可以无论 child 的体型如何都要求固定尺寸。 Canvas 就是后者的一个例子。

接下来,元素会被告知它们的大小,并要求它们自己和它们的 child 进行排列。

网格面板类型不仅允许行和列,而且还非常擅长自动调整内容大小。

StackPanel 类型在其定向的维度中根本不会自动调整大小,但会在其他维度中自动调整大小。

Canvas 可以自动调整大小以填充空间,但它绝不允许其子项自动调整大小。它在指定的坐标处绘制其子级,并且不关心它们有多大。

我建议尝试只有一行/列的网格。

或者您可以创建一个具有更好的自动调整大小功能的新 Canvas 类。在测量过程中,您可能需要测量子元素并相应地调整 Canvas 的大小。您可能会发现这样的类(class)对以后很有帮助。

这是一篇关于 Auto Layout 的文章在 WPF 中。

如果您想创建自定义面板,这里有一个子主题:Custom Panel Elements .

编辑: 另一件事:您还可以将子元素的宽度/高度绑定(bind)到 Canvas 上的 ActualWidth 和 ActualHeight 属性,以便子元素调整其父元素的大小。如果需要,您可以使用转换器来设置尺寸比例。

关于.net - 强制自定义 WPF 控件正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/518674/

相关文章:

c# - 无法将类型为 'System.Windows.Forms.Form' 的对象转换为类型 'Project.Form1'

jquery - 在 ASP.NET 用户控件上使用 JQuery?

c# - 如何通过 IEnumerable 使用 TableQuery 进行查询?

.net - 等待多个输入时如何使用 TPL TransformBlock?

wpf - 使用 ListView 和 GridView 删除额外的 "Space"

c# - 在运行时合并 WPF ResourceDictionary

c# - 重复的相机流

c# - 为什么列表比较失败,如果列表(似乎)相同

wpf - datatrigger 中的反向动画

wpf - 内部控件和 View 模型之间的 UserControl 属性 "relay";感觉/工作不正常