【问题标题】:Grid vs. Canvas网格与画布
【发布时间】:2010-11-07 17:39:14
【问题描述】:

我正在寻找有关在 WPF 中使用 Canvas 与 Grid 面板的意见。 我需要制作具有基本网格布局的经典输入表单,有些可能内部有小数据网格、组框,但都在网格布局中对齐。我正在为我的所有表单使用网格还是画布面板而苦苦挣扎。网格给了我良好的结构;我可以更轻松地保持控件的对齐方式。我将拥有所有窗口的基类(继承 Window 类),因此 Visual Studio 中的设计器将毫无用处,因为这种继承存在问题,并且使用 Grid 面板我什至不需要设计器,我可以设置窗口 SizeToContent 以便一切正常。但是再次使用 Canvas,我能够以任何我喜欢的方式定位控件,这是我在使用 Canvas 时看到的唯一好处。

我在 WPF 方面没有太多经验来预测我会从客户对布局的请求中遇到哪些问题。在网络表单上,我有时会为表单使用绝对定位,以防客户有一些“特殊”要求,是否将控制像素设置在右侧或左侧更高等。每个与要求苛刻的客户一起工作的人都知道我的意思。

我想看看您的想法,在业务应用程序表单布局构建中两者的优缺点是什么?为什么一个比另一个好?在任何情况下,一个面板会不好使用,而另一个则不会?一个面板对另一个面板有什么缺点?你会用什么面板?

谢谢

【问题讨论】:

    标签: .net wpf xaml grid canvas


    【解决方案1】:

    我会选择 Grid 或专门的 Grid 子类。您对 View 继承是正确的。 UWP 中的 Visual Studio 设计器 WPF 为具有相同方法名称的基类和子类生成支持代码。它不编译。

    由于我早于泛型,我们可以回到以前的方法。其中之一是助手类。每个 View 都实现了IBaseView,并有一个属性ViewHelperViewHelper<T>。很可能需要enum ViewHelperOptions。如果需要,每个 ViewHelper 都可以使用继承而不破坏可视化设计器。这允许在不破坏 MVVM 模型的情况下使用通用代码和特定视图代码。我们称它为 MVHVM,因为 ViewHelper 了解 ViewHelper。这进一步将 V 与 VM 分开。

    完整的实现可能需要使用Activator.CreateInstance。另一个考虑因素是设计者调用的构造函数。您必须将所有“如果未运行将崩溃”代码移动到从(例如)Loaded 事件产生的初始化中。或者,您可以使用 (UWP):

    if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
    { DoStuffWhichShouldOnlyBeDoneAtRunTime(); }
    

    【讨论】:

      【解决方案2】:

      Canvas 主要用于自定义绘图功能。网格绝对是自定义布局的最佳选择。

      【讨论】:

      【解决方案3】:

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

      WPF/SL/XAML 的主要用户体验优势之一是类似于 HTML 的“液体”布局功能。即使您当前的设计可能不需要它,但它显然是未来,非常值得学习如何精巧。

      查看 Rob Relyea 的可用XAML editors 优秀列表

      【讨论】:

      • 链接失效,请修复
      【解决方案4】:

      您可以深入了解网格的实际布局、列/行跨度、宽度、高度等。

      在我看来,通过控制行和列 sizez 在网格上进行各种项目的布局比将所有内容硬编码到画布中更容易。如果他们决定在以后更改决议,这也会使事情变得更容易。

      来自 Adam Nathan 的 WPF Unleashed(第 168 页):

      用网格模拟画布 如果您将 Grid 保留为单行和单列并设置 Horizo​​ntalAlignment 和 将所有子项垂直对齐到 Stretch 以外的值,子项被添加到 就像画布一样的单个单元格。将 Horizo​​ntalAlignment 设置为 Left 和 VerticalAlignment to Top 就像将 Canvas.Left 和 Canvas.Top 设置为 0。 Horizo​​ntalAlignment to Right 和 VerticalAlignment to Bottom 就像设置 Canvas.Right 和 Canvas.Bottom 为 0。此外,将 Margin 值应用于每个 element 可以给你与设置 Canvas 的附加属性相同的效果 价值观。

      您还可以利用网格中控件的内容进行创意,以获得更精细的布局控制。

      画布适用于对话框之类的东西,这种对话框很少改变大小,并且只有几个控件,因为随着数量的增加,将它们全部布置出来会很耗时。

      我个人自己使用网格。将事物布置到像素级别可能需要更多的工作,但在必要的 5% 时间里,抽象掉很多麻烦是值得的。当需要动态调整行和列的大小时,它也很不错,GridSplitter 让这一切变得轻而易举。

      【讨论】:

        【解决方案5】:

        绝对网格似乎是满足您的要求所需要的。

        我将 Grids 比作 html 中的表格(如果使用得当,非常有用),而 Canvas 更像是一个 div。不同之处在于 Grid 是 HTML 中的表格,div 和 Canvas 也是如此。

        关于网格的主题,花时间定义您的 RowDefinitions 和 ColumnDefinitions,而不是在控件上放置边距以正确定位所有内容。不然你会后悔的。

        【讨论】:

        • 嗯...你知道不建议使用表格进行布局,对吧?
        • 绝对是,但是为了这个例子,我想用一些东西作为例子,我认为这将是最好的例子。正如我所提到的,WPF 中的网格是 HTML 中的表格。
        猜你喜欢
        • 2018-09-08
        • 2016-10-14
        • 1970-01-01
        • 2011-10-28
        • 2013-04-24
        • 2010-12-12
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多