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

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(使用前将#替换为@)

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

  • 在 Windows 10 应用程序中获取 WiFi 适配器列表失败

    我有一个 Windows 10 通用应用程序 我正在尝试获取 WiFi 适配器列表 var adapters await WiFiAdapter FindAllAdaptersAsync 我已设置所有必需的权限 这调用一次就有效 然后 当我
  • 优化 WPF 中由单元格组成的网格以获得最短路径

    我目前正在尝试在 WPF 中制作一个由 Cell 对象组成的网格 我需要将单元格绑定到对象 该对象需要位于二维数组中 我需要它很大 可扩展 并改变单元格的颜色并将数据存储在对象中 我已经实现了 但是绘制网格似乎很慢 100x100 网格需要
  • 更改选项卡时,文本框上的验证工具提示会变得孤立

    我在 TabControl 内的 TabItem 上有一个 TextBox 使用 INotifyDataError 基于更改的验证 当 TextBox 中存在错误并且您将注意力集中在 TextBox 上时 将显示验证工具提示 如果我导航到其
  • 如何向 ItemsControl 中的 WPF 按钮添加相同的命令

    如何将命令添加到 wpf 按钮 该按钮是ItemsControl并正在修改ItemsSource itself 这是我的 XAML
  • 带有复选框的 WPF ListBox:在选中之前选择复选框

    Problem 我有一个列表框 其中列表框是复选框 第一次单击时 复选框将被选中并选中 第二次单击时 仅设置复选框 人们可以使用箭头键重新选择不同的复选框 我的目标是 首先选择复选框 然后再检查 再次单击它 从而消除对箭头键的需要 Goal
  • 具有自定义镶边的 WPF 窗口在右侧和底部有不需要的轮廓

    我使用 Microsoft Windows Shell dll 创建了带有自定义镶边的 WPF 窗口 这是代码
  • Xamarin - 在 xmlns clr 命名空间中找不到类型

    我正在制作一个 Xamarin Forms 应用程序 解决方案称为RESTTest 我的共享项目名为RestApp 在我的共享项目中 我有一个名为ViewModels 其中包含一个名为MainViewModel cs 我有一个名为MainP
  • XAML 网格可见性转换?

    我有一个网格 其可见性绑定到我的视图模型中的属性 这一切都工作正常 网格正确地出现 消失 我的问题是 如何应用过渡 以便网格内容滑入 UI 边缘 而不是立即从屏幕上消失 当它可见时 它应该再次滑出
  • Windows 睡眠功能极慢

    我正在通过 Windows h 使用 Sleep 命令制作一个程序 并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异 我将我的程序简化为下面的程序 它与我的更复杂的程序表现出相同的行为 在 Wi
  • 使用 UTF-8 编码的 Powershell 字符串变量

    我检查了许多与此相关的问题 但找不到解决我的问题的东西 基本上 我想将 UTF 8 编码的字符串存储在变量中 然后使用该字符串作为文件名 例如 我正在尝试下载 YouTube 视频 如果我们打印视频标题 则会显示非英文字符 ytd这是you
  • xamarin 形式的图像上方其他图像的一半

    我正在使用 xamarin 表单 我需要创建一个布局 其中两个对象的位置如下 一个 圆 的一半在另一个对象 正方形 之上 我已经搜索过了 看来我需要使用相对布局 我尝试将两个对象设置在同一网格 行和行 0 中 然后使用constraintX
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • silverlight/xaml 中通知的图标徽章覆盖

    我的 silverlight 应用程序中有一个功能区栏 并且在其中一个图标上我希望有一个徽章图标 显示该图标激活的视图中的项目数 想象一下 OS X 中显示未读邮件数量的邮件图标或 IOS 应用程序图标上的通知计数器 我对 xaml 样式不
  • 为什么 Slack 会导致 Windows 10 BSOD?

    每次我从睡眠状态恢复笔记本电脑时 我都会遇到 BSOD 我已经使用分析了小型转储WinDbg并且引起的过程总是Slack exe 我用谷歌搜索了一下我发现了https www tenforums com bsod crashes debug
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 如何更改 WPF TabControl 的 ItemTemplate 的样式以便设置选项卡标题的背景颜色?

    我使用 WPF TabControl 的 ItemTemplate 属性来绑定每个 TabItem 标头的内容 我还使用 ItemContainerStyle 属性将 TabItem 的内容设置为动态选择的用户控件 此方法 100 按预期工
  • WPF:将布尔值显示为“是”/“否”

    我有一个布尔值 需要在 TextBlock 中显示为 是 或 否 我尝试使用 StringFormat 执行此操作 但我的 StringFormat 被忽略并且 TextBlock 显示 True 或 False
  • Windows 10:任务栏中的图标大小错误

    从 Windows 10 开始 任务栏中的图标大小似乎为 24x24px 如果 Windows 选择图标文件中的 24px 版本进行显示 那么这不会有问题 但它选择了 32px 版本并将其缩小 这会导致丑陋的伪像 尤其是当你的图标中有直线时
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐