Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)
本话讲的是Avalonia中相比于WPF更方便的一些特性
布局
布局方面没什么好说的,和WPF没什么区别,Grid,StckPanel...这些,不熟悉的话可以B站上找一下教程
xml树
在WPF中我们是可以在调试的时候显示Xml结构树的,在Avalonia中有些区别,在调试模式下,我们可以按F12调出Devtools,就可以看到Xml结构树了
Margin
在Avalonia中,我们有两种方式去给元素更便利的添加Margin
特性
看到Margin,熟悉WPF的小伙伴应该很清楚有时候为了给panel中各种控件写margin的繁琐,现在Avalonia对于布局新出了一个特性,Spacing。
在这里可以看到,我在StackPanel中放了4个Textblock,且没设间距,看起来像只有一个元素一样,在WPF中,我们调整间距的话还得去给每一个子元素添加margin间距,。
但是现在有新特性,直接一句代码就可以搞定。没错,就简简单单的
Spacing="10"
就搞定了每一个元素的间距,再也不用为了调整各种间距而头疼了
style
没错,我们还可以使用Style来更方便的给元素添加特性。也许大家会想,WPF中不也可以吗。其实在Avalonia中对于选择器引入了CSS的概念,熟悉前端的小伙伴应该知道,css选择器有很多,可以更加方便的查找符合条件的元素,不说废话,上图,请看下图
这里可以看到,我们定义了一个样式,大家有没有看出区别,没错,在StackPanel上有这么一个属性
Classes="aaa"
,这代表我们可以给这个元素绑定多个属性,和前端用法一样Classes="class1 class2"
就可以添加多个特性了在Style上,也看到这么一句话
Selector="StackPanel.aaa TextBlock"
,这句话代表什么呢,也就是这个样式只会作用于StackPanel且带有aaa样式下的所有TextBlock元素。所以,看到这里,其实已经知晓Avalonia中引入了css中的概念,有各种选择器。这可以使我们更加便利的调整自己所需要的样式。
特性
Watermark提示文本
在WPF中我们要知道,想要为输入框输入提示文本,要么借助第三方控件库,要么自己自定义控件,但是在Avalonia中,官方自己提供了这个属性,就是Watermark,只需要在textbox上加上这个属性就行
<TextBox Watermark="请输入账号"></TextBox>
可以清除的看到只需要加上这么一个属性就完成了提示文本
MaskedTextBox
这个控件我们知道winform中有,wpf中原生是没有的,想要只能自定义,而Avalonia中原生是自带这个控件的
<MaskedTextBox Mask="(+86) ###-####-####"></MaskedTextBox>
只需要这么使用,我们就能得到下图的效果
RowDefinitions、ColumnDefinitions
在Wpf中我们定义一个三行三列的栅格布局得这么写
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
但是在Avalonia中我们只需要这么写就可以实现同样的效果,当然,在比较复杂的场景下也可以像上面的写法来写,并不是说只支持下面这种写法,下面这种写法只是在简单场景下更方便我们写布局,不用再去写更多的代码
<Grid RowDefinitions ="*,*,*" ColumnDefinitions="*,*,*"></Grid>
数据绑定
这里简单说一下数据绑定上相对于WPF的便利性
<TextBox Name="txtTelphone" Width="200" Watermark="请输入电话号码"></TextBox>
<TextBlock Text="{Binding #txtTelphone.Text}"></TextBlock>
这里同样可以看到类似于CSS选择器的绑定方式,直接将输入框的文本绑定到textblock上了。
对于数据绑定还有更多便利的使用,请查看官方文档Avalonia下更方便的数据绑定
响应式事件
这里的响应式事件也就是会监听某个属性的状态来决定某个元素的状态,也就是响应用户交互并触发操作,下面将用一个最简单的例子来讲一下,其效果和前端表单Form的数据验证一样
<TextBox Width="200" Watermark="请输入文本" Text="{Binding InputText}"></TextBox>
<Button Width="100" Content="测试按钮" Command="{Binding ButtonIsEnableCommand}"</Button>
private string _inputText;
public string InputText
{
get => _inputText;
set => this.RaiseAndSetIfChanged(ref _inputText, value);
}
public ReactiveCommand<Unit,Unit> ButtonIsEnableCommand { get; }
public MainWindowViewModel()
{
var buttonIsEnable = this.WhenAnyValue(x=>x.InputText,x=>!string.IsNullOrWhiteSpace(x));
ButtonIsEnableCommand = ReactiveCommand.Create(ButtonIsEnable, buttonIsEnable);
}
private void ButtonIsEnable()
{
}
上面是我们的代码,可以看到我们给文本框绑定了属性,同样也给按钮绑定了事件,这样会有什么效果呢,看下图
可以清楚的看到,在文本框没有输入文本的情况下,按钮是不可点击的状态,且我们并没有设置按钮的的IsEnable属性。这样就完成了响应式事件,对于这种情况,相信很多小伙伴可以想到应用的场景。在某些场景下,我们要根据状态来是否可执行下一步就可以用这个来实现
动画Animation
说到动画,我们更加熟悉的应该是前端了,前端实现动画可以说是最简单了,基于css可以实现很多酷炫好看的动画。
现在在Avalonia中我们也可以像css一样,更好的使用关键帧动画、过渡效果,
如上面两张图所示,我们可以看到css选择器的概念,基于这种概念,去设置对应元素的动画和过渡效果,比起WPF来是不是更方便呢
此次记录的便利性暂时到这,博主后续会继续研究继续更新其他的便利性,咱们下一话讲一下某些从WPF转到Avalonia下可能遇到的坑
Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)的更多相关文章
- .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。
介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...
- coreseek实战(二):windows下mysql数据源部分配置说明
coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...
- WPF入门教程系列(二) 深入剖析WPF Binding的使用方法
WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...
- CleanAOP实战系列--WPF中MVVM自动更新
CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- chrome调试工具高级不完整使用指南(实战二)
3.3 给页面添加测试脚本 在现实的工作中,我们往往会遇到一些问题在线上就会触发然后本地就触发不了的问题.或者是,要给某个元素写一个测试脚本.这个时候如果是浏览器有提供一个添加脚本的功能的话,那么我们 ...
- 通过Intel XDK编写跨平台app(二)
通过Intel XDK编写跨平台app(一) 通过Intel XDK编写跨平台app(二) 在这个系列的上一篇文章中,我们大致了解了Interl XDK的概况.在这一部分中,我们会详细地介绍如何通过这 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
- Netty 仿QQ聊天室 (实战二)
Netty 聊天器(百万级流量实战二):仿QQ客户端 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之15 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在 ...
随机推荐
- switch-case内不能定义变量?
1. 报错 switch(something) { case a: int a = 0; break; default: break; } 结果报错: error: cannot jump from ...
- 在离线环境使用nuget包
原来程序集的引用 一个项目所有功能我们不可能都自己写对吧.这个时代 引用一大片的第三方包 项目源文件几百兆 ,有可能第三方包占了总体积99%.有可能我们自己写的代码不过几十行.想想我们原来的 老时代 ...
- 玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!
本文分享自天翼云开发者社区<玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!>,作者:天翼云社区官方账号 Super Idol的笑容虽然非常甜 无数粉丝宝宝的心里却 ...
- 用脚本采用wget方式直接下载谷歌云盘里面的文件实操
今天在工作中遇到了一个挑战,在这里和大家分享一下我的解决过程.突然接到一个紧急需求,需要在服务器上部署一个模型文件,而这个文件存储在谷歌云盘里.摆在面前有两个选择: 方案一:先在本地下载,然后再上传到 ...
- FreeSql学习笔记——7.分组聚合
前言 分组就是将元数据通过某些条件划分为组,而聚合就是对这些组进行整合操作:在sqlserver数据库中使用的关键字group by使符合条件的集合通过某些字段分好组,再使用聚合函数(如max() ...
- JDK8项目简单快速接入AI大模型(无需强制使用JDK17)
最近AI风头越来越火,好多项目都需要接入AI接口,但Spring-AI强制绑定JDK17这些,导致以前的很多JDK8项目不太方便 找到个办法,使用AI4J来接入 1.本地部署Ollama,这个属于部署 ...
- Jupyter Notebook 一些常用的快捷键
命令模式(按 Esc 进入): A:在当前单元格上方插入新单元格. B:在当前单元格下方插入新单元格. D + D(按两次 D 键):删除当前单元格. Z:撤销单元格删除. Ctrl + Enter: ...
- HTTP - [01] 简介
HTTP本身是不安全的,因为传输的数据未经加密,可能会被窃听或篡改.为了解决这个问题,引入了HTTPS,即在HTTP上加入SSL/TLS协议,为数据传输提供了加密和身份验证. 一.概述 HTTP( ...
- 【BUUCTF】Blacklist
[BUUCTF]Blacklist (SQL注入) 题目来源 收录于:BUUCTF GYCTF2020 题目描述 纯粹的SQL注入题 当触发黑名单时返回如下 过滤了以下关键字 set prepare ...
- 手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开
原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波.方波和三角波,频率小于1MHz.支持幅度调节,提供原始和6倍放大输出接口.配备5阶低通滤波器.噪 ...