.NET跨平台框架AvaloniaUI:填坑指北(⼀):熟悉UI操作
Avalonia 是⼀个跨平台的 .NET UI 框架,⽀持 Windows、Linux、 (以及Android  IOS soon..)
本篇主要介绍Avalonia开发过程和Linux适配环节的⼏个疑难点..
与WPF类似,Avalonia使⽤XAML来设计UI...但也有⼏处⽐较坑的地⽅,以下做⼀些梳理:
1.基本的使⽤⽅法
axaml中定义后台到并设置对象view ui框架
在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
建议将所有的控件优先查出来(如果你控制得⽐较好可以不⽤..)
事件
有⼏点⽐较坑的地⽅:
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.居然没有(可以到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.数据绑定
可以在axaml中设置绑定,将数据放到全局变量中,或者直接对items进⾏赋值
但是只能有单⼀的类型...
2.使⽤UserControls 并将它们放在List合集中对items直接赋值..
----------------------------分割线------------------------------
⽬前发现的坑就有这么多.....但是axaml中的style和animation不是很友好..(animation可以说是辣鸡)
个⼈看来avalonia还尚未成熟但⾜以使⽤到普通需求中...
下⼀篇将讲avalonia跑到linux上的⼀些坑
有啥问题Q俺:2728578956

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。