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 聊天室 实战 源码 写在 ...
随机推荐
- 玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定
本文分享自天翼云开发者社区<玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定>,作者:天翼云社区官方账号 随着社会经济的发展和人民生活水平的提高,越 ...
- have my hair cut
标题致敬传奇抗压王裤子. 今天去剪了头发.体验很好,老师帅. 但是还是一直很不安 我们 i 人剪了头发是这样的 剪头发不是换发型 但大概率得换 而且很快会剪短 乌龟的壳换了形状 或是变薄 肯定不安 一 ...
- Q:浏览器不能上网,但是可以ping通外网ip,dns配置也没问题(TCP/IP 无法建立传出连接)
问题症状 每隔一段时间,浏览器不能访问外网,重启电脑又正常,重置网卡无效 可以ping通外网ip地址,可以ping通外网域名 ping不通外网端口端口 查看日志 每次出现不能上网情况时都会有至少两条T ...
- Maven配置多数据源
一.配置文件 修改maven配置文件,用户目录下.m2文件夹中的setting.xml,内容如下 <?xml version="1.0" encoding="UTF ...
- mysql之增删改
编写配置文件[db.properties]: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy?useUni ...
- [HAOI2018] 染色 题解
第一眼肯定想到容斥.设 \(G(k)\) 表示至少有 \(k\) 种颜色符合要求,\(F(k)\) 表示恰好有 \(k\) 种颜色符合要求.显然 \(k\) 的上界 \(t=\min(m,\lfloo ...
- 移动硬盘插入win10检测到却不显示盘符解决方法
1.开始菜单中的设置-----设备. 2.选择"蓝牙和其他设备" 3.在其他设备栏中就能看到检测到的移动硬盘,点击删除设备后重新插入移动硬盘即可在此电脑上显示盘符.
- 植物大战僵尸杂交版,最新安装包(PC+手机+苹果)+ 修改器+高清工具
植物大战僵尸杂交版:全新游戏体验与创意碰撞 游戏简介 <植物大战僵尸杂交版>是由B站知名UP主潜艇伟伟迷基于经典游戏<植物大战僵尸>进行的一次大胆且富有创意的二次创作.这款游戏 ...
- luogu-P3343题解
简要题意 给定一张 \(n\) 个点 \(m\) 条边的图,边的边权是 \([0, 1]\) 之间均匀分布的随机实数,且相互独立.求最小生成树的最大边权的期望值. 思路 首先有一个比较神秘的跟概率有关 ...
- 【Unit4】UML解析器(模型化设计)-作业总结 & 【BUAA-OO】课程总结
第四单元作业总结 1.题目概述 UML类图建模与查询(8) + UML顺序图/状态图建模与查询(3+3) + 模型错误检查(9),三次迭代共23条命令 2.构架设计 一开始以为和第三单元差不多,稍微用 ...