网格 vs 画布

14

我正在寻求在WPF中使用Canvas和Grid面板的意见。我需要制作经典的输入表单,这些表单基本上具有网格布局,有些可能在内部有小的数据网格、组合框,但全部都是对齐的网格布局。我正在纠结于是否在所有窗体中都使用Grid或Canvas面板。Grid给我很好的结构;我可以更容易地维护控件的对齐。我将为所有窗口创建基类(它继承了Window类),因此在Visual Studio中的设计器将无用,因为它存在这种继承问题,而对于Grid面板,我甚至不需要设计器,并且我可以设置窗口的SizeToContent属性,以便所有东西都适合得很好。但是,通过Canvas,我可以根据自己的喜好放置控件,这是使用Canvas的唯一好处。

我没有太多关于WPF的经验来预测客户请求布局方面会遇到什么问题。在Web表单中,我有时会为表单使用绝对定位,以防客户有一些“特殊”请求,例如像素向左或向右等等。所有与苛刻的客户一起工作的人都知道我的意思。

我希望看看您的想法,构建业务应用程序表单布局的优缺点是什么?为什么一个比另一个更好?是否有任何情况其中一个面板使用不当,而另一个不会?一个面板对另一个面板的劣势是什么?您会使用哪种面板?

谢谢

5个回答

18

Canvas主要用于自定义绘图功能,而网格布局是定制您的布局的最佳选择。


我同意CSharperWithJava的观点 - <Grid>是一种更实用的通用UI布局元素。 - Giffyguy
1
你需要选择基于网格或面板的布局。请查看WPF布局系统的MSDN概述:http://msdn.microsoft.com/en-us/library/ms745058.aspx - rmoore
这是一个教程,帮助您入门网格布局: http://www.wpftutorial.net/GridLayout.html - CodeFusionMobile

3
您可以深入了解网格布局的实际布局、列/行跨度、宽度、高度等。在我看来,通过控制行和列的大小来布置各种项目的网格比硬编码到画布中做所有事情要容易得多。如果他们决定以后更改分辨率,这也会使事情变得更容易。
来自Adam Nathan的《WPF Unleashed》(第168页):
模拟Canvas的Grid 如果您将Grid保留为单个行和列,并将所有子项的HorizontalAlignment和VerticalAlignment设置为Stretch以外的值,则子项将像Canvas一样添加到单个单元格中。将HorizontalAlignment设置为Left和VerticalAlignment设置为Top就像将Canvas.Left和Canvas.Top设置为0一样。将HorizontalAlignment设置为Right并将VerticalAlignment设置为Bottom就像将Canvas.Right和Canvas.Bottom设置为0一样。此外,为每个元素应用Margin值可以使您获得与设置Canvas的附加属性相同的效果。
您还可以在网格控件的内容中进行创意,以获得更细致的布局控制。
对于像很少更改大小且仅有少量控件的对话框之类的东西,画布非常适用,因为随着数量的增长,将它们全部布置起来会变得耗时。我个人使用网格。将物品布置到像素级可能需要更多的工作,但对于必要的5%的时间,它值得为抽象化许多麻烦而努力。当需要动态调整行和列大小时,GridSplitter使这成为轻而易举的事情。

2

毫无疑问,对于您的要求来说,网格似乎是您需要的。

我认为网格就像html中的表格(适当使用非常有用),而Canvas更像一个div。区别在于,网格是HTML中应该是表格的东西,同样地,div与Canvas也是如此。

关于网格的话题,花时间定义您的RowDefinitions和ColumnDefinitions,而不是在控件上放置边距以正确定位所有内容。如果您不这样做,您将会后悔。


3
哦...你知道使用表格来进行布局并不被推荐,对吗? - luiscubal
当然,但是为了举个例子,我需要一个可以用作示例的东西,我认为那是最好的示例。正如我所提到的,WPF中的网格是HTML中尝试实现表格的东西。 - Chris Nicol

0
我会选择使用网格或专门的网格子类。您对视图继承的理解是正确的。UWP、WPF中的Visual Studio设计器为基类和子类生成相同方法名称的支持代码,但它无法编译。
由于我比泛型更早,我们可以回到以前的方法论。其中之一是帮助器类。每个视图都实现IBaseView,并具有属性ViewHelper或ViewHelper。可能需要枚举ViewHelperOptions。如果需要,每个ViewHelper都可以使用继承而不会破坏Visual Designer。这允许使用通用代码以及特定视图代码,而不会破坏MVVM模型。让我们称之为MVHVM,因为ViewHelper具有对ViewHelper的知识。这进一步将V与VM分离。
完整的实现可能需要使用Activator.CreateInstance。另一个考虑因素是由设计师调用的构造函数。您必须将所有“如果未运行则崩溃”的代码移动到从(例如)Loaded事件产生的初始化中。或者,您可以利用(UWP):
if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{ DoStuffWhichShouldOnlyBeDoneAtRunTime(); }

0

即便您不能使用VS Designer,仍然可以使用XAML可视化设计师来创建/编辑网格内容。

WPF/SL/XAML的主要UX优势之一是类似HTML的“液体”布局能力。即使您当前的设计不需要它,这显然是未来值得学习和完善的技能。

请查看Rob Relyea提供的出色的XAML编辑器列表


链接失效,请修复。 - kbo4sho88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接