.NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作
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操作的更多相关文章
- .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了
上一章回顾: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...
- Python之locust踩坑指北
坑点1:locust安装报错 其中一种情况:error:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visua ...
- WEB安全漏洞挖掘向入坑指北
这个指北不会给出太多的网站和方向建议,因为博主相信读者能够从一个点从而了解全局,初期的时候就丢一大堆安全网址导航只会浇灭人的热情,而且我也不适合传道授业解惑hhh 安全论坛: 先知社区 freebuf ...
- vueThink框架搭建与填坑(new)
自己跟着官网搭建vueThink框架,发现github上文档有很多坑.所以总结一下(仅针对WIN端下载使用) 1.安装node.js 前端部分是基于node.js上运行的,所以必须先安装node.js ...
- 十一、VueJs 填坑日记之使用Amaze ui调整列表和内容页面
上一篇博文我们整合了Amaze ui,并且调整了一个头部header和底部footer文件,其实做起来也很简单,只要按照步骤来做,完全没有问题.今天我们来重新调整一下列表页面和内容页面,使我们做的后台 ...
- Android平台MediaCodec避坑指北
https://www.jianshu.com/p/5d62a3cf0741 最近使用MediaCodec做编解码H264,写一点东西以免自己再次掉坑. 先说一下具体环境,使用的是,Windows10 ...
- 三分钟入坑指北 🔜 Docsify + Serverless Framework 快速创建个人博客系统
之前由于学摄影的关系,为了提高自己的审美,顺便锻炼下自己的英文能力,翻译了不少国外艺术类的 文章.最近一直想搭一个个人博客来存放这些内容,又懒得折腾建站,遂一直搁置. 直到偶然发现了 docsify ...
- .NET Core UI框架Avalonia
.NET Core UI框架Avalonia,Avalonia是一个基于WPF XAML的跨平台UI框架,并支持多种操作系统:Windows(.NET Framework,.NET Core),Lin ...
- 十、VueJs 填坑日记之在项目中使用Amaze UI
上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...
随机推荐
- Python3 迭代器深入解析
第6章 函数 6.1 函数的定义和调用 6.2 参数传递 6.3 函数返回值 6.4 变量作用域 6.5 匿名函数(lambda) 6.6 递归函数 6.7 迭代器 6.8 生成器 6.9 装饰器 6 ...
- 普通list和树状list互转
import java.util.ArrayList; import java.util.List; public class TreeNode { private String id; privat ...
- 将终结点图添加到你的ASP.NET Core应用程序中
在本文中,我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由.上面文章我向您演示了如何生成一个有向图(如我上篇文章中所示),可以使用Gra ...
- 推荐收藏:100道Linux笔试题,能拿90分以上的都去了BAT
本套笔试题共100题,每题1分,共100分.(参考答案在文章末尾) 1. cron 后台常驻程序 (daemon) 用于: A. 负责文件在网络中的共享 B. 管理打印子系统 C. 跟踪管理系统信息和 ...
- C++语法小记---函数重载
函数重载 函数重载的本质是对已有功能的扩展 构成重载的三大条件 函数名相同 参数列表不通(与返回值无关) 重载函数的作用域相同 成员函数之间可以重载,成员函数和静态成员函数之间可以构成重载,全局函数之 ...
- PowerJob 技术综述,能领悟多少就看你下多少功夫了~
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列.从本章开始,就正式进入 PowerJob 框架的技术 ...
- vue学习(五) 访问vue内部元素或者方法
//html <div id="app"> <input type="button" value="ok" v-bind: ...
- 给隔壁的妹子讲『一个SQL语句是如何执行的?』
前言 SQL作为Web开发是永远离开不的一个话题,天天写SQL,可是你知道一个SQL是如何执行的吗? select name from user where id = 1; 上面是一个简单的查询语句, ...
- Spring Date JPA实现增删改查
1.新建一个Cart类 package com.entity; public class Cart { private int id; private int userId; private int ...
- Python 实现分层聚类算法
''' 1.将所有样本都看作各自一类 2.定义类间距离计算公式 3.选择距离最小的一堆元素合并成一个新的类 4.重新计算各类之间的距离并重复上面的步骤 5.直到所有的原始元素划分成指定数量的类 程序要 ...