gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:47:29 24 4
gpt4 key购买 nike

Grid 的文档类(class)规定:

Starting in Windows 10, Grid defines new border properties that let you draw a border around the Grid without using an additional Border element. The new properties are Grid.BorderBrush, Grid.BorderThickness, Grid.CornerRadius, and Grid.Padding.



这是否会使 Border类(Class)多余?如果我可以用 Grid 做同样的事情并以网格方式布置子项,我为什么要使用 Border 呢?

编辑

我大致同意 Bart's answer ,但有几件事我想谈谈。

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

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

最后,我决定找出 Grid 如何实现边框外观。我创建了一个简单的页面,其中包含一个带有边框的 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)。

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

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

最佳答案

您设计 UI 的第一个问题应该是我需要 Grid或其他布局控件( StackPanelRelativePanelCanvas 、...)基于每个控件的特定行为(请参阅 MSDN )。注意旁边的Grid , 还有 StackPanelRelativePanelBorder附加属性。这些附加属性有助于您无需在 XAML 树中添加另一个“冗余”控件来包装布局控件。

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

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

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

    关于xaml - 我什么时候应该使用 Border over Grid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39675269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com