我是 WPF 的新手,我一直无法确定如何创建我需要的屏幕。
我有一个应用程序正在尝试在 WPF 上重新开发。当程序开始时,一个文本文件被加载到一个内存对象中,该对象包含调查问题/答案定义。对于具有预设答案选项的问题,例如单选按钮(单个)或复选框(多个)条目,目标是尽可能在屏幕上一次显示所有答案(不滚动)。为此,答案在 4 种不同的显示格式之间进行测试,范围从 1 到 4 列答案,以获得最佳匹配。一旦找到最适合的元素,就会以确定的任何格式将元素绘制到屏幕上。
这在 WinForms 中工作得很好,但根据它处理 UI 创建和测量的方式,它在 WPF 中似乎是一个问题。任何可以提供的帮助/想法将不胜感激...
更多信息:
A - 单列布局
B - 两列
C - 三列
D - 四列
E - Tow Column Example,其中为 Checkbox 或 RadioButton 示例换行的文本。
** 这里的关键是,当页面加载时,我还不知道这些格式中的哪一种在不滚动的情况下适合我的内容,更不用说最适合了。这就是我现在挂断电话的地方。在我的应用程序的旧 WinForms 版本中,我在显示之前测量所有内容,因此我知道哪种格式最适合它。
另一个问题是我总是希望 2+ 时的列高度大致相等。因此,如果它几乎不能放在一个列中,我希望看到两个较短的列,而不是 1 个长列和一个很短的列。
最佳答案
您应该使用 WPF 提供的相对大小调整布局机会,这样您就不必像在 WinForms 中那样担心测试特定布局。
例如,您可以:
- 将您的窗口设置为根据您的内容自动调整大小。
- 设置 网格布局中列的相对大小(即 1/3 与 2/3),以便 任何内容将始终以这些比例显示。
- 设置最大值和 列/网格/窗口的最小尺寸,以便内容可以换行,如果 必要的。
少考虑固定布局策略的工作原理,多考虑如何让布局对内容使用react,就像基于 CSS 的网络系统一样。
编辑:
基于V1-4布局的更新,您应该考虑是否可以根据提供的内容确定布局。如果是这样,请为内容 ViewModel
类型创建适当的通用 DataTemplates
(您的 ViewModel
可以是单个类 - 这是 WPF 的优势之一数据绑定(bind)和 MVVM)并使用 TemplateSelector
根据某些选择逻辑为内容提供 DataTemplate
(布局)。
编辑(第 2 步):
要测量文本,请使用 FormattedText
类。
要测量整个 Control
,请使用特定的 Size
调用 Measure()
。如果 DesiredSize
大于 Measure()
Size
参数,则内容会溢出提供的边界并且可能会滚动,具体取决于您是否允许滚动(您可以使用 ScrollViewer.CanContentScroll
附加属性禁用滚动,但内容将被剪裁)
关于c# - 根据内容的最佳匹配测试创建 WPF UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27528183/