WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇

news/2025/3/20 13:53:10/文章来源:https://www.cnblogs.com/fanbal/p/18782899

WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇

笔者前端框架使用的是 Vue3 + Deno。
笔者主要会以 Avalonia 作为 C# 技术部分的示例。
本文主要是向大家列出 WPF 和 Avalonia 的 Grid 在 html 和 css 的实现方法。
你其实也完全可以使用纯原生的 html+css,或者是 React、Blazor 等等框架来实现,因为本质是 html + css。

一、Grid 的创建

在 Avalonia 中,我们创建了一个这样的 Grid,一个天蓝色的具有固定尺寸,内部具有一个 TextBlock 元素的布局。

<GridWidth="300"Height="300"Background="Aqua"><TextBlock Text="hello avalonia" />
</Grid>

在 WPF 中,内部的 TextBlock 理应会居中……但是 Avalonia 中是这样的,很是奇怪。

在前端的部分,我们可以以这样的方式创建一个同样效果的网格。

<template><div class="grid-container"><span class="grid-child">hello html+css</span></div>
</template><style lang="css" scoped>.grid-container {display: grid;background-color: aqua;width: 300px;height: 300px;}.grid-child {/* todo */}
</style>

在这边,你可以发现一些共通之处,于是我们来列一下对应关系吧。

WPF 和 Avalonia html + css 备注
<Grid> display:grid
Background background-color 事实上 background-color 只是 css 中代表纯色的样式,如果要填入图片得用另外的属性,我们会在 background 的地方详细说明
Width width 在 css 中要注意有单位,如 px
Height height 在 css 中要注意有单位,如 px

二、在网格中的对齐

你可以发现,我们默认创建出来的结构,样子根本不一样,原因是因为各个框架对于默认对齐的看法不一样,在前端中,水平居中比垂直居中要来的显眼很多……

那么我们来将内容进行居中吧。

在 Avalonia 中,我们为内部的 TextBlock 添加了 HorizontalAlignment="Center"VerticalAlignment="Center",通过这种方式实现了居中。

具体代码请看这里:

<GridWidth="300"Height="300"Background="Aqua"><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"Text="hello avalonia" />
</Grid>

在前端的实现中,我们可以做成这样的效果:

我们使用了 justify-self: centeralign-self: center 来让内容进行了居中。

其中 justify-self 代表水平对齐,参考 HorizontalAlignmentalign-self 代表垂直对齐,参考 VerticalAlignment

详细的对应表我们可以来看一下这个:

WPF 和 Avalonia html + css 备注
HorizontalAlignment="Left" justify-self: self-start 水平、左对齐
HorizontalAlignment="Right" justify-self: self-end 水平、右对齐
HorizontalAlignment="Center" justify-self: center 水平、居中
VerticalAlignment="Top" align-self: self-start 竖直、顶对齐
VerticalAlignment="Bottom" align-self: self-end 竖直、底对齐
VerticalAlignment="Center" align-self: center 竖直、居中
VerticalAlignment="Stretch" align-self: stretch 水平、拉伸
VerticalAlignment="Stretch" align-self: stretch 竖直、拉伸

同样的,如果你使用 Stretch 拉伸,宽度和高度请不要指定。

我们来看一下在前端使用 stretch 和 margin 的例子:

这就是 具体代码请注意 .grid-child 的效果。

<template><div class="grid-container"><div class="grid-child"></div></div>
</template><style lang="css" scoped>.grid-container {display: grid;background-color: aqua;width: 300px;height: 300px;}.grid-child {background-color: yellow;margin: 5px 5px 5px 5px;align-self: stretch;justify-self: stretch;}
</style>

三、Grid 的网格切分

1. WPF 和 Avalonia 的网格切分

说到网格,必不可少的就是介绍网格的切分了。

我们虽然我使用的是 Avalonia,但是为了保证和 WPF 的兼容,我们还是使用符合 WPF 风格的网格切分来进行布局。

我们希望在每个网格上提供一个 TextBlock,来看看怎么样吧。

    <GridWidth="300"Height="300"Background="Aqua"><Grid.RowDefinitions><RowDefinition Height="80" /><RowDefinition Height="1*" /><RowDefinition Height="2*" /><RowDefinition Height="auto" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*" /><ColumnDefinition Width="3*" /><ColumnDefinition Width="2*" /></Grid.ColumnDefinitions><TextBlockGrid.Row="0"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="0,0" /><TextBlockGrid.Row="0"Grid.Column="1"HorizontalAlignment="Center"VerticalAlignment="Center"Text="1,0" /><TextBlockGrid.Row="0"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Text="2,0" /><TextBlockGrid.Row="1"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="0,1" /><TextBlockGrid.Row="1"Grid.Column="1"HorizontalAlignment="Center"VerticalAlignment="Center"Text="1,1" /><TextBlockGrid.Row="1"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Text="2,1" /><TextBlockGrid.Row="2"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="0,2" /><TextBlockGrid.Row="2"Grid.Column="1"HorizontalAlignment="Center"VerticalAlignment="Center"Text="1,2" /><TextBlockGrid.Row="2"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Text="2,2" /><TextBlockGrid.Row="3"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="0,3" /><TextBlockGrid.Row="3"Grid.Column="1"HorizontalAlignment="Center"VerticalAlignment="Center"Text="1,3" /><TextBlockGrid.Row="3"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Text="2,3" /></Grid>

我知道这个写法很长,事实上,因为我们没有办法照顾到 WPF 和 Avalonia 的样式的写法,为此选择了最为冗长的写法。
我们的网格划分照顾到了 Grid 的 3 种划分方式:

  1. 像素
  2. 星*
  3. Auto

在 WPF 和 Avalonia 中,这几个的意思是:

  1. <RowDefinition Height="80" /> 这里指定了第一行就是 80 像素
  2. <RowDefinition Height="1*" /><RowDefinition Height="2*" /> 可以将除了像素 和 Auto 分完后剩下的东西,再进行比例的拆分,这里的 1* 和 2* 的意思就是将剩下的内容,其中 1* 占 1/(1+2) 份,而 2* 占 2/(1+2)份。
  3. Auto 的高度取决于内部的控件,如果内部控件很大,那 Auto 也会很大。

好了,下面我们来看前端的实现。

2. html + css 前端的网格切分

在 html 和 css 中,你可以使用 grid-template-rowsgrid-template-columns 以及在容器中,使用 grid-rowgrid-column

具体的效果是这样的:

<template><div class="grid-container"><span class="grid-child grid-child-0-0">0,0</span><span class="grid-child grid-child-1-0">1,0</span><span class="grid-child grid-child-2-0">2,0</span><span class="grid-child grid-child-0-1">0,1</span><span class="grid-child grid-child-1-1">1,1</span><span class="grid-child grid-child-2-1">2,1</span><span class="grid-child grid-child-0-2">0,2</span><span class="grid-child grid-child-1-2">1,2</span><span class="grid-child grid-child-2-2">2,2</span><span class="grid-child grid-child-0-3">0,3</span><span class="grid-child grid-child-1-3">1,3</span><span class="grid-child grid-child-2-3">2,3</span></div>
</template><style lang="css" scoped>.grid-container {display: grid;background-color: aqua;width: 300px;height: 300px;grid-template-rows: 80px 1fr 2fr auto;grid-template-columns: 1fr 3fr 2fr;}.grid-child {align-self: center;justify-self: center;}.grid-child-0-0 {grid-row: 1;grid-column: 1;}.grid-child-1-0 {grid-row: 1;grid-column: 2;}.grid-child-2-0 {grid-row: 1;grid-column: 3;}.grid-child-0-1 {grid-row: 2;grid-column: 1;}.grid-child-1-1 {grid-row: 2;grid-column: 2;}.grid-child-2-1 {grid-row: 2;grid-column: 3;}.grid-child-0-2 {grid-row: 3;grid-column: 1;}.grid-child-1-2 {grid-row: 3;grid-column: 2;}.grid-child-2-2 {grid-row: 3;grid-column: 3;}.grid-child-0-3 {grid-row: 4;grid-column: 1;}.grid-child-1-3 {grid-row: 4;grid-column: 2;}.grid-child-2-3 {grid-row: 4;grid-column: 3;}
</style>

你需要看到的是,你可以用类似 80px 表示 WPF 和 Avalonia 中的像素写法。

关于 WPF 和 Avalonia 的星号相对比例写法,你可以使用 fr 单位来表示,而 Auto 在 css 里面也是支持的。

3. html + css 前端的差别

差异表可以在这里看到。

WPF 和 Avalonia html + css 备注
Grid.RowDefinitions 和一系列定义 grid-template-rows 同样支持像素、星号和 Auto 的写法,其中像素在 css 里面要带单位 px,星号在 css 里面会写成 fr,如 1fr,2fr,Auto 写成 auto
Grid.ColumnDefinitions 和一系列定义 grid-template-columns 同样支持像素、星号和 Auto 的写法,其中像素在 css 里面要带单位 px,星号在 css 里面会写成 fr,如 1fr,2fr,Auto 写成 auto
Grid.Row grid-row WPF 和 Avalonia 里面从 0 开始,但是 css 里面从 1 开始,不用带单位!
Grid.Column grid-column WPF 和 Avalonia 里面从 0 开始,但是 css 里面从 1 开始,不用带单位!

我们在这里没有讨论 Grid.ColumnSpanGrid.RowSpan 的状况,实际上你可以使用 grid-column-startgrid-column-endgrid-row-startgrid-row-end来进行相关配置。

四、网格内容的层叠

在 Avalonia 中,如果你没有划分网格,只有层叠的需求。
Avalonia 会推荐你使用 Panel 来实现同样的效果,Panel 不具有划分网格的能力,
但是足够简单,如果为了性能而优化的话,使用 Panel 是一个更好的选择。

在 WPF 和 Avalonia 中,我们会使用 Grid 在同一个格点堆叠一些 Border 或者是 TextBlock 这样的内容实现卡片的效果。
总之,网格的层叠是我们实现样式外观的一种方式。

我们来看一下 WPF 和 Avalonia 中,我们会使用这种技巧做怎样的事情。

如你所见,虽然你可以使用 Border 内部的 Child 实现嵌套,但是 Grid 本身也是支持层叠的。

Grid 的层叠在很多时候,可以帮助你实现一些特殊的效果,比如右上角的装饰。

注意右上角的 New!!!!!!!!

代码请看下面这样。

    <GridWidth="300"Height="300"Background="Aqua"><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"Text="Hello, Avalonia!" /><TextBlockHorizontalAlignment="Right"VerticalAlignment="Top"Text="New!!!!!!!!" /></Grid>

那么我们可以如何在前端 html 和 css 中实现对应效果呢?

4.1 错误的实现

在前端中,grid 系统内部存在自动分格子的机制,所以,下面的这种效果就是你想当然的做法,作为错误示例,希望你能够看到。

完全和上面不一样吧。

错误的代码是这样的。

<template><div class="grid-container"><span class="grid-child">Hello, html+css!</span><span class="corner-tag">new!!!!!!!</span></div>
</template><style lang="css" scoped>.grid-container {display: grid;background-color: aqua;width: 300px;height: 300px;}.grid-child {align-self: center;justify-self: center;}.corner-tag {align-self: self-start;justify-self: self-end;}
</style>

4.2 正确的实现,对与错其实很近

其实你离正确的实现只差几步,下面是你要做的事情:

  1. 指定网格要划分几格
  2. 为元素指定放置在哪个格子

其实在 WPF 和 Avalonia 里面,你也完全可以指定要划分多少格子以及放置在哪里。

<template><div class="grid-container"><span class="grid-child">Hello, html+css!</span><span class="corner-tag">new!!!!!!!</span></div>
</template><style lang="css" scoped>.grid-container {display: grid;background-color: aqua;width: 300px;height: 300px;grid-template-columns: 1fr;grid-template-rows: 1fr;}.grid-child {align-self: center;justify-self: center;grid-row: 1;grid-column: 1;}.corner-tag {align-self: self-start;justify-self: self-end;grid-row: 1;grid-column: 1;}
</style>

五、结论

WPF 和 Avalonia 的 Grid 完全可以在 html css 上直接迁移,虽然会有一些名字上的差异,但是完全对迁移没有任何影响。
WPF 和 Avalonia 的 Grid 可以说是 UI 的基础逻辑,虽然前端也有 flex 这样更为经典的布局容器,但是我认为,如果你更擅长 WPF 和 Avalonia,使用 Grid 也同样能够做出一样的效果,完全没有使用 flex 的必要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20244220 实验一《Python程序设计》实验报告

实验一 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;编写一个猜数字的游戏。(二)实验要求 熟悉Pycharm等开发环境; 掌握基本的Python运行和调试技能; 掌握基本的Python编程技能。 (…

74.8K star!这个开源图标库让界面设计效率提升10倍!

Font Awesome 是全球最受欢迎的图标库和工具包,提供超过2000个免费图标和7000+专业图标,支持网页、桌面应用、移动端等多平台使用。开发者只需几行代码就能为项目添加精美矢量图标,设计师可直接下载SVG进行二次创作。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最…

如何在Java程序中使用泛型

如何在Java程序中使用泛型泛型可以使你的代码更灵活、更易读,并能帮助你在运行时避免ClassCastExceptions。让我们通过这篇结合Java集合框架的泛型入门指南,开启你的泛型之旅。Java 5引入的泛型增强了代码的类型安全性并提升了可读性。它能帮助你避免诸如ClassCastException(…

BUUCTF从0到1:N1BOOk(web入门,常见的信息收集)

各位师傅们,第一次写博客文章: 就从最简单的web信息收集入门吧: 信息收集在不管时在红蓝对抗还是在ctf比赛中都是具有很大的作用 我们先看题:题目提示:信息收集,我们就直接打开虚拟机kali用dirsearch命令扫描网址: 对于新手来说dirsearch还未安装,dirsearch安装看这个:…

小白也能搞定系统搭建!7步教你选对开发平台!

你有没有遇到过这种情况: —— 想搞个客户管理系统,结果一搜教程,满屏都是代码,瞬间头大? —— 公司事儿一堆,老板还不想花钱买现成的系统,非要我们自己搭,可咱也不会写代码啊,这可咋整? 其实,现在做系统根本不用写代码,有些工具拖拽一下就能搭建,小白也能轻松上手…

如何学习 ROS+PX4

博客地址:https://www.cnblogs.com/zylyehuo/参考 https://www.bilibili.com/video/BV1vx4y1Y7Tu?spm_id_from=333.788.player.switch&vd_source=4acdb875c05ce9dccfce3cd6cfaac651

Mavros Mavlink

博客地址:https://www.cnblogs.com/zylyehuo/参考 https://www.bilibili.com/video/BV1x841167uG?spm_id_from=333.788.videopod.sections&vd_source=4acdb875c05ce9dccfce3cd6cfaac651

用于太阳能电池板的线性电机物联网控制器

随着能源成本的增加,太阳能电池板显然是减少这些费用的一条途径。即使有一对面板在一串(两个串联),和一个电网限制电流逆变器(如优秀的SUN-1000GTIL2和SUN-2000GTIL2系列),你可以节省很多钱-即使在冬天!后面的文章将详细介绍各种具有成本效益的选项和经验。 LMIC LMIC(线性电…

leetcode每日一题:最少翻转操作数

题目 2612. 最少翻转操作数 给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p ,它们表示一个长度为 n 且下标从 0 开始的数组 arr ,数组中除了下标为 p 处是 1 以外,其他所有数都是 0 。 同时给你一个整数数组 banned ,它包含数组中的一些位置。banned 中第 i 个位置表…

黄色网站破解

最近再查资料, 莫名其妙弹窗黄色网站下载页面, 我的手机是iOS非越狱版本, 我当然是敢点击的, 即使有病毒也不怕。 51duhui是虚假的应用, 假冒app store风格下载安装, 狗日的,发现是下载mobileconfig, 看下下载的按钮,代码如下:function jumpurl(url) {setTimeout(f…

“人工智能+”智赋千行百业!

今年,DeepSeek在AI赛道一骑绝尘 以“火炎焱燚”之势迅速延伸 开启中国AI黄金时代 如今,中国的AI故事正在书写新篇 中国的科技强国之路也正越走越宽在DeepSeek引领的人工智能热潮中 作为云服务国家队 天翼云“息壤”智算平台率先完成 国产算力与DeepSeek-R1/V3 系列大模型的深…

使用Kettle将sqlserver库表结构和数据导入到oracle

一、官网下载kettle的压缩包pdi-ce-9.4.0.0-343.zip ,下载jtds-1.3.1.jar和ojdbc8-19.3.0.0.jar 将jar放入\data-integration\lib 目录下二、将zip解压后,是一个data-integration文件夹,找到spoon.bat 双击运行,即可打开kettle工具三、打开以后,右键点击转换,新建一个转换…