什么时候应该使用Border over Grid?

时间:2016-09-24 10:20:52

标签: xaml uwp windows-10

Grid类的文档声明:

  

从Windows 10开始,Grid定义了新的边框属性,使您可以在不使用其他Border元素的情况下在网格周围绘制边框。新属性是Grid.BorderBrush,Grid.BorderThickness,Grid.CornerRadius和Grid.Padding。

这会使Border类多余吗?如果我可以使用Grid 以网格方式布置子项,如果我选择的话,为什么我会想要使用Border?

修改

我普遍同意Bart's answer,但我想谈谈一些事情。

首先,其他布局控件(如StackPanel)确实具有类似Border的属性,例如BorderBrush,BorderThickness和CornerRadius,因此Grid不是获得这些新特权的唯一布局控件。但它们不是Border类提供的附加属性(或者与Border类有任何关系)。

其次,我也认为如果我只想在像图像这样的简单控件中添加边框,那么使用像Grid这样的复杂布局控件会有点过分。但是,这些布局控件肯定会进行优化,如果它们只包含一个没有任何特殊布局约束的子节点,那么对布局渲染速度的任何影响都可以忽略不计。因此,当它只有一个子节点时,使用Grid而不是Border应该不会影响性能。

最后,我决定了解Grid如何实现边框外观。我创建了一个包含带边框和单个Rectangle子网格的简单页面,如下所示:

<Grid Background="Red" BorderBrush="Blue" BorderThickness="10">
    <Rectangle Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top" Fill="Yellow"/>
</Grid>

使用以下渲染:

Screenshot

在检查实时可视树时,Grid类不会向可视树添加任何其他元素以使边框显示:

Screenshot

我怀疑它用于创建边框外观的任何机制都与Border控件的相同(也许它会在合成图层中创建一个额外的Visual)。

所以我并不是真的相信“更简单”的边框控件会更好用,因为它看起来像Grid控件已经非常高效。我看不到网格控件的任何证据,为视觉树添加任何额外的开销(与边框相比,可以实现相同的效果)。

到目前为止,我能想到为什么我应该使用Border而不是Grid的唯一原因是表达意义。很明显边框控件的作用是,在单个元素周围添加边框。 Grid是一个布局控件,用于在网格中布置子元素(正如它所发生的那样,它还能够在其子元素周围添加边框作为额外的奖励)。

1 个答案:

答案 0 :(得分:3)

设计用户界面的第一个问题应该是我需要Grid或其他布局控件(StackPanelRelativePanelCanvas,...)基于每个控件的特定行为(参见MSDN)。请注意,在Grid旁边,StackPanelRelativePanel附加了Border个附加属性。这些附加属性对于您不在XAML树中添加另一个“冗余”控件来包装布局控件是非常有用的。

为什么Border控件不会过时?假设你想要一个图像周围的边框(它在任何上面提到的布局控件中与其他项目一起使用,因此你不能重复使用布局控件的边框)。现在您有两个选择:

  • 将图像包装在Border控件中。
  • 将图像包装在Grid(或其他布局控件)中,并滥用附加的属性。

我的措辞应该清楚哪一个是最好的:选择边框控件。经验法则是:保持您的视觉树尽可能小。选择最简单的控制来完成任务。将图像放置在Grid只是为了在其周围添加边框会增加视觉树中的额外开销。