好吧,所以我试图找出最好的方法来实现这个独特的案例。我有一个全屏WPF应用程序,其中控件被动态添加到Grid
,用户可以选择自由移动/调整大小它们。控件可以在父Grid
的任何位置单独移动或调整大小,但我已阻止它们通过MouseMove
事件重叠。它们也不能移动到容器外面。由于应用程序将在具有不同显示器大小的计算机上运行,因此在制作原始布局时我需要考虑到这一点。我有一个我想要使用的初始布局,但似乎我没有选择:
我首先尝试使用行和列 来(最初)放置添加的控件。此方法正确放置它们但在我需要移动或调整元素大小时会出现问题,因为控件已经分配到特定的行和列。我可以尝试使用此方法,然后在放置控件后删除任何行/列,但我认为这不会很好。
我还考虑过 Viewbox ,但由于相当明显的原因(因为它只是调整控件大小以适应屏幕),这在我的情况下并不实用。我不想使用它,因为我只需要它来标准化我的初始布局。就是这样。我也不想弄乱任何将在窗口上显示的文字。
所以是的,这更像是一种最佳实践"问题,因为我能想到的任何解决方案看起来都不会很专业或优雅。如果您需要澄清,请随时提出任何问题。
编辑:作为补充说明,我更倾向于使用Grid
而不是Canvas
作为我的容器。
编辑2:为了清楚起见,我会不在首次启动后需要特定的(初始)布局 。当程序退出时,每个元素的布局(边距,宽度和高度等)将保存到文件中以用于下次启动。
答案 0 :(得分:2)
我使用WPF开发了许多自助服务终端/交互式应用程序。如果您试图显示元素转换(移动时),那么最好使用父Canvas并绑定Canvas.Left和Canvas.Top属性。如果放置机制(例如操纵/鼠标事件,转换器)以确保Canvas附加属性适应行/列偏移,则可以使用Canvas模拟网格对齐。
使用Viewbox缓解显示差异(并且您的用例不是“相当独特”)并不罕见。您将Viewbox设置为目标分辨率(例如1920x1080)并允许控件填充可用空间。另一种方法是根据应用程序窗口大小/比率动态应用内容模板。
答案 1 :(得分:0)
在查看了多个选项之后,我决定使用计算来(排序)模拟行/列的行为。因为我的应用程序是全屏的,所以我可以使用SystemParameters.PrimaryScreenWidth
和SystemParameters.PrimaryScreenHeight
来确定我的布局。使用通用填充(静态值)和基于比率的计算(动态值)的组合,我可以平滑地设置我的初始布局。
例如,我将监视器的宽度除以6
(向上舍入以避免小数)并使用它(减去控件宽度的一半)作为控件的Margin.Left
属性,将其居中在一个'列'的种类。
老实说,我的初始布局现在非常简单,所以我们会看看这是否足够。感谢所有为这个问题做出贡献的人,如果我不清楚我在问什么,那就很抱歉。