代码之家  ›  专栏  ›  技术社区  ›  Andrija

网格与画布

  •  11
  • Andrija  · 技术社区  · 17 年前

    我正在寻找在WPF中使用画布和网格面板的意见。 我需要制作基本上具有网格布局的经典输入表单,一些表单内部可能有小的数据报,分组框,但都在网格布局中对齐。我在为所有表格使用网格或画布面板而苦苦挣扎。网格为我提供了良好的结构;我可以更容易地保持控件的对齐。我将为所有窗口提供基本类(继承窗口类),因此Visual Studio中的设计器将毫无用处,因为它存在此类继承问题,而且对于网格面板,我甚至不需要设计器,我可以设置窗口大小Content,以使所有内容都适合。但是对于画布,我有能力以我喜欢的任何方式定位控件,这只是我在使用画布时看到的好处。

    我在WPF方面没有太多的经验来预测我可以从客户的布局请求中得到什么样的问题。在Web表单上,我有时会对表单使用绝对定位,以防客户有一些__特殊__请求是否在更高的位置上使用控制像素等。与要求高的客户合作的每个人都知道我的意思。

    我想看看您的想法,在业务申请表布局构建中,两者的优缺点是什么?为什么一个比另一个好?如果一个面板不好用,另一个不好用?一个面板对另一个面板有什么缺点?您将使用什么面板?

    谢谢

    5 回复  |  直到 9 年前
        1
  •  16
  •   ЯegDwight kri    15 年前

    画布主要用于自定义绘图功能,而不是其他功能。网格绝对是定制布局的最佳选择。

        2
  •  3
  •   amarcy    17 年前

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

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

    来自亚当·内森的 WPF释放 (第168页):

    用网格模拟画布 如果在网格中只保留一行和一列,并设置水平标记和 所有子级与值垂直对齐,而不是拉伸,子级将添加到 单细胞就像画布。将水平信号设置为左侧和 垂直对齐到顶部就像设置canvas.left和canvas.top到0。设置 水平向右,垂直向下 画布。右和画布。从下到0。此外,对每个 元素可以提供与将画布的附加属性设置为相同的效果。 价值观。

    您还可以创造性地使用网格中控件的内容,以获得更精细级别的布局控件。

    画布很适合像对话框这样很少改变大小的东西,并且只有几个控件,因为随着数字的增长,将它们全部布局会很费时。

    我自己使用网格。把事情安排到像素级可能需要更多的工作,但在必要的5%的时间里,把很多麻烦抽象出来是值得的。当需要动态调整行和列的大小时,网格拆分器也会使其成为一个快照。

        3
  •  2
  •   Chris Nicol    17 年前

    一定地 网格似乎是您所需要的。

    我将网格比作HTML中的表(适当使用时非常有用),而画布更像是一个DIV。不同之处在于网格是HTML中表应该是什么,DIV和画布也是如此。

    在网格的主题上,花时间定义行定义和列定义,而不是在控件上放置边距来正确定位所有内容。如果你不这样做,你会后悔的。

        4
  •  0
  •   Douglas    17 年前

    即使不能使用vs设计器,也可以使用XAML可视化设计器创建/编辑网格内容。

    wpf/sl/xaml的主要UX好处之一是类似HTML的“液体”布局功能。尽管您可能不需要它与您目前的设计,它显然是未来和很值得学习如何巧妙。

    查看Rob Relyea的最佳可用列表 XAML editors

        5
  •  0
  •   Paulustrious    9 年前

    我将使用网格或专门的网格子类。关于视图继承,您是对的。wpp和wpf中的Visual Studio设计器为具有相同方法名的基类和子类生成支持代码。它不能编译。

    因为我预先确定了泛型的日期,所以我们可以回到以前的方法论。其中之一是帮助类。每个视图实现 IBaseView 并且拥有财产 ViewHelper ViewHelper<T> . enum ViewHelperOptions 很可能需要。如果需要,每个viewhelper都可以使用继承而不破坏可视化设计器。这允许在不破坏MVVM模型的情况下使用通用代码和特定视图代码。让我们称之为mvhvm,因为viewhelper了解viewhelper。这进一步将V与VM分开。

    全面实施可能需要使用 Activator.CreateInstance . 另一个考虑因素是设计器调用的构造函数。您必须将所有“如果不运行将崩溃”的代码移动到从加载的事件(例如)派生的初始化中。或者,您可以使用(uwp):

    if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
    { DoStuffWhichShouldOnlyBeDoneAtRunTime(); }
    
    推荐文章