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...但也有几处比较坑的地方,以下做一些梳理:

1.基本的使用方法

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<TextBlock>("TB_Title");
TB_Title.Text = "嘻嘻";

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

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

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

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

事件

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

有几点比较坑的地方:

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

<Button x:Name="btn" Click="Btn_Click">Click Me</Button>
void Btn_Click(object sender, RoutedEventArgs args)
{
//...
}

若不成功可以:

this.Get<Button>("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中下载第三方的包)

2.神奇的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还尚未成熟    但足以使用到普通需求中...

下一篇将讲avalonia跑到linux上的一些坑

有啥问题Q俺:2728578956

.NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作的更多相关文章

  1. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...

  2. Python之locust踩坑指北

    坑点1:locust安装报错 其中一种情况:error:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visua ...

  3. WEB安全漏洞挖掘向入坑指北

    这个指北不会给出太多的网站和方向建议,因为博主相信读者能够从一个点从而了解全局,初期的时候就丢一大堆安全网址导航只会浇灭人的热情,而且我也不适合传道授业解惑hhh 安全论坛: 先知社区 freebuf ...

  4. vueThink框架搭建与填坑(new)

    自己跟着官网搭建vueThink框架,发现github上文档有很多坑.所以总结一下(仅针对WIN端下载使用) 1.安装node.js 前端部分是基于node.js上运行的,所以必须先安装node.js ...

  5. 十一、VueJs 填坑日记之使用Amaze ui调整列表和内容页面

    上一篇博文我们整合了Amaze ui,并且调整了一个头部header和底部footer文件,其实做起来也很简单,只要按照步骤来做,完全没有问题.今天我们来重新调整一下列表页面和内容页面,使我们做的后台 ...

  6. Android平台MediaCodec避坑指北

    https://www.jianshu.com/p/5d62a3cf0741 最近使用MediaCodec做编解码H264,写一点东西以免自己再次掉坑. 先说一下具体环境,使用的是,Windows10 ...

  7. 三分钟入坑指北 🔜 Docsify + Serverless Framework 快速创建个人博客系统

    之前由于学摄影的关系,为了提高自己的审美,顺便锻炼下自己的英文能力,翻译了不少国外艺术类的 文章.最近一直想搭一个个人博客来存放这些内容,又懒得折腾建站,遂一直搁置. 直到偶然发现了 docsify ...

  8. .NET Core UI框架Avalonia

    .NET Core UI框架Avalonia,Avalonia是一个基于WPF XAML的跨平台UI框架,并支持多种操作系统:Windows(.NET Framework,.NET Core),Lin ...

  9. 十、VueJs 填坑日记之在项目中使用Amaze UI

    上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...

随机推荐

  1. 十分钟快速搭建Python+Selenium自动化测试环境(含视频教程)

    文章首发于微信公众号:爱码小哥 准备安装包: 一:安装python:   双击python-3.7.6.exe执行文件 2.点击下一步正在安装: 3.如图所示表示安装完成: 校验环境是否安装成功:   ...

  2. Python Ethical Hacking - Packet Sniffer(1)

    PACKET_SNIFFER Capture data flowing through an interface. Filter this data. Display Interesting info ...

  3. Python面试题!百度大牛总结十条Python面试题陷阱

    无论是应聘Python web开发,爬虫工程师,或是数据分析,还是自动化运维,都涉及到一些基础的知识!我挑了一些Python的基础面试题,看看你能不能的答上来,也许面试的同学用的着! 问题1:请问如何 ...

  4. 你闺女也能看懂的插画版 Kubernetes 指南

    Matt Butcher是Deis的平台架构师,热爱哲学,咖啡和精雕细琢的代码.有一天女儿走进书房问他什么是Kubernetes,于是就有了这本插画版的Kubernetes指南,讲述了勇敢的Phipp ...

  5. vs code的使用(一) Format On Paste/Format On Save/ Format On Type

    很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...

  6. ant design pro/前端/JS:实现本地运行https

    工具:github---mkcert 用于生成本地证书 ant p版本:1.0.0 这里我只说如何给antp部署https,以及会遇到的问题解决,其他请看原文参考 1.用mkcert生成证书,去git ...

  7. 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!

    大家好啊,今天栈长给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架,有些我甚至都没有用过,但我知道它曾经风光过. 废话不多说,下面我要开始吹了-- 1.Swing 下面这个是用 swing ...

  8. PHP each() 函数

    实例 返回当前元素的键名和键值,并将内部指针向后移动: <?php $people = array("Peter", "Joe", "Glenn ...

  9. PHP ftp_ssl_connect() 函数

    定义和用法 ftp_ssl_connect() 函数打开一个安全的 SSL-FTP 连接. 当连接打开,您就可以在服务器运行 FTP 函数. 语法 ftp_ssl_connect(host,port, ...

  10. vjudge CountTables/2018雅礼集训 方阵 dp 斯特林反演

    LINK:CountTables 神题! 首先单独考虑行不同的情况 设\(f_i\)表示此时有i列且 行都不同. 那么显然有 \(f_i=(c^i)^\underline{n}\) 考虑设\(g_i\ ...