我什么时候应该使用边框而不是网格?

2024-01-04

的文档Grid https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.grid.aspx类状态:

从 Windows 10 开始,网格定义了新的边框属性,使您可以在网格周围绘制边框,而无需使用额外的边框元素。新属性包括 Grid.BorderBrush、Grid.BorderThickness、Grid.CornerRadius 和 Grid.Padding。

这是否使Border https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.border.aspx阶级多余?如果我可以用网格做同样的事情,为什么我还要使用边框and如果我选择的话,以网格方式布置孩子?


EDIT

我大体同意巴特的回答 https://stackoverflow.com/a/39676183/734040,但有几件事我想谈谈。

首先,其他布局控件(如 StackPanel)确实具有类似 Border 的属性,如 BorderBrush、BorderThickness 和 CornerRadius,因此 Grid 并不是唯一获得这些新功能的布局控件。但他们不是attached由 Border 类提供的属性(或与 Border 类有任何关系)。

其次,我也认为,如果我只想向像图像这样的简单控件添加边框,那么使用像 Grid 这样的复杂布局控件就太过分了。但可以肯定的是,这些布局控件将被优化,这样,如果它们仅包含单个子项而没有任何特殊的布局约束,则对布局渲染速度的任何影响都可以忽略不计。因此,当网格只有一个子项时,使用网格而不是边框​​不会影响性能。

最后,我决定找出 Grid 是如何实现边框外观的。我创建了一个简单的页面,其中包含一个带有边框的网格和一个矩形子项,如下所示:

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

具有以下渲染:

在检查实时可视化树时,Grid 类不会向可视化树添加任何其他元素来形成边框外观:

我怀疑它用来创建边框外观的任何机制都与边框控件的作用相同(也许它在合成层中创建了一个额外的视觉效果)。

所以我不太相信“更简单”的边框控件会更好用,因为它看起来网格控件已经相当高性能了。我看不到任何网格控件向可视化树添加任何额外开销的证据(与边框实现相同效果相比)。

到目前为止,我能想到为什么应该使用边框而不是网格的唯一原因是为了表达含义。边框控件的作用很明显,它在单个元素周围添加边框。网格是一个布局控件,用于在网格内布置子元素(碰巧,网格也能够在其子元素周围添加边框作为额外的好处)。


设计 UI 时你的第一个问题应该是我需要一个Grid或其他布局控件(StackPanel, RelativePanel, Canvas,...)基于每个控件的具体行为(参见MSDN https://msdn.microsoft.com/en-us/windows/uwp/layout/layout-panels)。请注意,旁边Grid, also StackPanel and RelativePanel have Border附加属性。这些附加属性有助于您避免在 XAML 树中添加另一个“冗余”控件来包装布局控件。

为什么是Border控制没有过时?假设您想要图像周围有一个边框(该图像与其他项目一起位于上述任何布局控件内,因此您无法重用布局控件的边框)。现在你有2个选择:

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

我的措辞应该清楚哪个是最好的:选择Border控制。经验法则是:使视觉树尽可能小。选择最简单的控件来完成任务。将图像放入Grid只是因为它周围有边框,所以会增加视觉树中的额外开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候应该使用边框而不是网格? 的相关文章

随机推荐