转自:TwilightLemoncnblogs.com/TwilightLemon/p/13474796.html

前言

Avalonia 是一个跨平台的.NET UI框架,支持 Windows、Linux、Mac OSX... (以及Android  IOS soon..)

本篇主要介绍Avalonia开发过程和Linux适配环节的几个疑难点..

avalonia for vs安装和.deb安装包部署可参考:

https://www.cnblogs.com/Fengyinyong/p/13346642.html

与WPF类似,Avalonia使用XAML来设计UI...但也有几处比较坑的地方,以下做一些梳理:

一、基本的使用方法

axaml中定义 后台找到并设置对象

在WPF中,当你在xaml文件中定义完UI并设置x:Name就可以在后台中直接使用对象名称进行操作.那是因为vs在你设计时自动生成了.g.i.cs文件(你可以在/obj中看到)

而ava中不同,你需要在后台中自己Get到这个UI对象(与Android类似): 例如:

axaml中定义一个名称为 TB_Title的TextBlock文本标签:

<TextBlock x:Name="TB_Title" HorizontalAlignment="Center" Foreground="White" FontSize="14" VerticalAlignment="Center" Margin="10,0,0,10" Text="My Avalonia Desktop App"/>

在cs中定义并更改标签内容:

TextBlock TB_Title = this.Get("TB_Title");TB_Title.Text = "嘻嘻";

这里就用到了this.Get(string Name)方法

T:表示对象类型  Name:为x:Name中定义的名称

注意:在后台查找UI对象 若不是局部变量 应需考虑 时序问题 否则在使用时对象可能是null

建议将所有的控件优先查找出来(如果你控制得比较好可以不用..)

事件

详细的介绍可以看官方文档:http://avaloniaui.net/docs/input/events

有几点比较坑的地方:

1、直接在axaml中定义事件有时候不会成功,可以在后台中定义,例如:

"btn" Click="Btn_Click">Click Mevoid Btn_Click(object sender, RoutedEventArgs args){//...}

若不成功可以:

this.Get("btn").Click+=Btn_Click;---------------------------------------

2、WPF中的MouseDown/Up事件和Preview事件哪去了?

ava中替换成了 Tapped(轻敲?) 事件

以及 PointerPressed (指针按下 相当于WPF 中的MouseDown) 和 PointerReleased (指针释放  相当于WPF中MouseUp)

为控件注册一个Preview事件:

你的控件名.AddHandler(PointerReleasedEvent,事件名称, RoutingStrategies.Tunnel);

----------------------------------------

3、居然没有MessageBox....(可以到nuget中下载第三方的包)

二、神奇的UI布局

在avalonia中StackPanel是有问题的,它并不会为每一个控件设置宽度或高度  而是优先控件 (WPF中不是这样):

举个例子:

例如在StackPanel中放置若干个TextBlock,你会看到TextBlock延伸到了StackPanel外部 而并没有按照stackpanel的宽度来...

ava中的模式是这样:

如果控件原宽度没有超出则设为stackpanel的宽度

如果超出了...就随它去吧......(??)

此时你就需要手动设置宽度(两种方法):

1、设置绑定:  Width="{Binding Width , ElementName=MyStackPanel(是控件x:Name)}"

2、在后台遍历设置宽度:

ava中并没有给SizeChanged的事件 而是将所有依赖属性改变的事件放到了一个:

PropertyChanged += MainWindow_PropertyChanged;private void MainWindow_PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e){if (e.Property == WidthProperty){foreach (Control a in e.Children) {         a.Width = Width;      }   } }

(十分嫌弃  ..)

神奇的属性Bounds:

如果你仔细一看,会发现各种你找不到的原WPF属性都在这里面:

例如元素的真实高宽:Bounds.Height/Width

元素相对于父控件的位置:Bounds.Position.X/Y

设置ListBox.Items的两种方式:

如果你熟悉了WPF,那么肯定会疑问 ListBox.Items.Add哪去了??

1、数据绑定

文档中展示了比较友好的绑定方式:http://avaloniaui.net/docs/controls/listbox

可以在axaml中设置绑定,将数据放到全局变量中,或者直接对items进行赋值

但是只能有单一的类型...

2、使用UserControls 并将它们放在List合集中   对items直接赋值..

----------------------------分割线------------------------------

目前发现的坑就有这么多.....但是axaml中的style和animation不是很友好..(animation可以说是辣鸡)

个人看来avalonia还尚未成熟    但足以使用到普通需求中...

wpf ui框架_.NET跨平台框架Avalonia UI相关推荐

  1. element ui 空格_空格是您的UI朋友。 大量使用它。

    element ui 空格 Originally published at marcandrew.me on July 30th, 2020. 最初于 2020 年7月30日 在 marcandrew ...

  2. vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条号.百家号等 ...

  3. python 分布式计算框架_漫谈分布式计算框架

    如果问 mapreduce 和 spark 什么关系,或者说有什么共同属性,你可能会回答他们都是大数据处理引擎.如果问 spark 与 tensorflow 呢,就可能有点迷糊,这俩关注的领域不太一样 ...

  4. 学习ui设计_如果您想学习UI设计,该怎么办

    学习ui设计 There is a question that is always asked when we want to learn something new. 当我们想学习新东西时,总会问一 ...

  5. 代码更换ui图片_不同人眼中的UI设计师都是什么样的?

    在日常生活中,当有人问你是做什么工作的,你谦虚的回答:我是一名UI设计师,平时使用软件绘图,画界面等.此时就会有人不屑一顾的说:UI设计不就是平面美工吗,还要扯啥设计师? ​而这样的称呼也被许多人所认 ...

  6. ui自动化测试框架_浅谈前端(UI)自动化测试

    作为一名测试开发从业者,自动化测试好像是绕不开的话题....结合最近接触到的一些测开应聘同学聊到关于前端自动化测试及自己的理解,分享一下自己对UI自动化测试的认识,大概如下. 测试分层的自动化测试思想 ...

  7. guice 框架_玩! 框架+ Google Guice

    guice 框架 在我目前正在工作的项目中,我们开始使用Google Guice. 对于那些不知道的人, Google Guice是一个依赖项注入框架. 依赖项注入的基本思想是提供一个其依赖的类,而不 ...

  8. java 路由框架_使用Spring框架和AOP实现动态路由

    本文的大体思路是展示了一次业务交易如何动态地为子系统处理过程触发业务事件.本文所示的例子使用Spring框架和Spring AOP有效地解耦业务服务和子系统处理功能.现在让我们仔细看看业务需求. 业务 ...

  9. python模型训练框架_使用TensorFlow框架基于SSD算法训练模型

    内容引用其它文章:https://my.oschina.net/u/876354/blog/1927351 目标检测是AI的一项重要应用,通过目标检测模型能在图像中把人.动物.汽车.飞机等目标物体检测 ...

最新文章

  1. 如何在Vim中用换行符替换字符
  2. linux7 rpmdb 修复,Linux[CentOS 7]rpmdb open failed错误修复
  3. 通过单步调试的方式学习 Angular 中 TView 和 LView 的概念
  4. kafka的简单概述及基本命令
  5. android手机apk动态替换桌面的logo和laber
  6. python气象包_Python-Cartopy包: 地图投影
  7. 电脑软件安装手册 2019年4月22日
  8. Shopee数据获取逻辑
  9. 如何计算 R 中 T 检验 的 P 值
  10. font标签及其属性
  11. 数据交易,距离生产要素市场化还有多远? | 2022全球数字价值峰会
  12. Postgres更改所有表的Owner
  13. python 三维栅状图_基于OpenGL的二维矢量地图可视化技术研究
  14. 【rviz_plugin Goal3DTools 深蓝路径规划 PluginlibFactory】
  15. liunx 用户管理(增加、删除、修改密码)
  16. fluentd收集K8S日志并以K8S的container_name作为索引名存入Elasticsearch中
  17. 如何用十六进制换算十进制
  18. 不如跳舞:AI自动合成舞蹈视频
  19. TPS54331DDAR —— DCDC降压设计12V 至 5.00V @ 3A【电感电容选择计算】
  20. lamda 获取当前循环数,AtomicInteger

热门文章

  1. 中国的房子其实是不断贬值的
  2. 使用百度API实现语音识别——in python
  3. 蔚来资本宣布完成约4亿美元二期基金募集
  4. 小红书再度出拳整治医美 首批处置违规笔记27.9万篇
  5. 闲鱼公布2021年度十大“无用”商品:网友买前壮志 买后吃灰
  6. 长假大考充电桩:堵车不可怕,没电才尴尬
  7. 华为nova 9系列曝光:全系标配骁龙778G 4G处理器
  8. 消息人士:欧盟下月将对英伟达收购Arm交易展开正式调查
  9. 苹果中国大出血! AirPods 2免费送了
  10. 3月4日见!Redmi Note 10系列屏幕升级:首次采用Super AMOLED屏