【Avalonia】Avalonia的学习笔记以及与WPF的不同点

以下均为初学入门写的一些学习记录,不保证理解都对啊。。。

1.axaml中引用命名空间

xmlns:model="using:IDataTemplateSample.Models"

2.Grid支持行列的简化写法

<Grid RowDefinitions="Auto, Auto, *" ColumnDefinitions="Auto, *"/>

3.DataTemplate 根据DataType自动选择对应类型的样式,使用Window.DataTemplates加载多个DataTemplate自动选择显示不同样式,类似WPF的DataTemplateSelector选择器

<Window.DataTemplates>
        <!--  Add a DataTemplate for a Student  -->
        <!--  Mind the order of the Templates. Begin with the most specific first.  -->
        <DataTemplate DataType="model:Student">
            <StackPanel>
                <TextBlock FontWeight="Bold" Text="{Binding Grade, StringFormat='I am a student in {0}. grade'}" />
                <!--  We re-use the PersonTemplate here by using DynamicResource  -->
                <ContentControl Content="{Binding}" ContentTemplate="{DynamicResource My.DataTemplates.Person}" />
            </StackPanel>
        </DataTemplate>

        <!--  Add a DataTemplate for a Teacher  -->
        <DataTemplate DataType="model:Teacher">
            <StackPanel>
                <TextBlock FontWeight="Bold" Text="{Binding Subject, StringFormat='I am a teacher for: &quot;{0}&quot;'}" />
                <!--  We use a UserControl here to display the data  -->
                <view:PersonView />
            </StackPanel>
        </DataTemplate>

    </Window.DataTemplates>

 4.前面说使用Window.DataTemplates类似WPF的选择器,实则Avalonia也有选择器

先创建一个选择器,选择器的Key和Datatemplate组成ShapesTemplateSelector的数据,根据DataType的类型然后通过选择器的Build创建出对应的数据模版。 

<Window.DataTemplates>
        <dataTemplates:ShapesTemplateSelector>
            <DataTemplate x:Key="RedCircle" DataType="model:ShapeType">
                <Ellipse Width="50"
                         Height="50"
                         Fill="Red"
                         Stroke="DarkRed"
                         StrokeThickness="2" />
            </DataTemplate>
            <DataTemplate x:Key="BlueCircle" DataType="model:ShapeType">
                <Ellipse Width="50"
                         Height="50"
                         Fill="Blue"
                         Stroke="DarkBlue"
                         StrokeThickness="2" />
            </DataTemplate>
            <DataTemplate x:Key="RedSquare" DataType="model:ShapeType">
                <Rectangle Width="50"
                           Height="50"
                           Fill="Red"
                           Stroke="DarkRed"
                           StrokeThickness="2" />
            </DataTemplate>
            <DataTemplate x:Key="BlueSquare" DataType="model:ShapeType">
                <Rectangle Width="50"
                           Height="50"
                           Fill="Blue"
                           Stroke="DarkBlue"
                           StrokeThickness="2" />
            </DataTemplate>
        </dataTemplates:ShapesTemplateSelector>
    </Window.DataTemplates>
public class ShapesTemplateSelector : IDataTemplate
    {
        // This Dictionary should store our shapes. We mark this as [Content], so we can directly add elements to it later.
        [Content]
        public Dictionary<string, IDataTemplate> AvailableTemplates { get; } = new Dictionary<string, IDataTemplate>();

        // Build the DataTemplate here
        public Control Build(object? param)
        {
            var key = param?.ToString(); // Our Keys in the dictionary are strings, so we call .ToString() to get the key to look up
            if (key is null) // If the key is null, we throw an ArgumentNullException
            {
                throw new ArgumentNullException(nameof(param));
            }
            return AvailableTemplates[key].Build(param); // finally we look up the provided key and let the System build the DataTemplate for us
        }

        // Check if we can accept the provided data
        public bool Match(object? data)
        {
            // Our Keys in the dictionary are strings, so we call .ToString() to get the key to look up
            var key = data?.ToString();

            return data is ShapeType                       // the provided data needs to be our enum type
                   && !string.IsNullOrEmpty(key)           // and the key must not be null or empty
                   && AvailableTemplates.ContainsKey(key); // and the key must be found in our Dictionary
        }
    }

5.可以创建Styles.axaml文件,里面添加多个样式,使用Design.PreviewWith进行样式预览

<Styles xmlns="https://github.com/avaloniaui"
        xmlns:controls="using:RatingControlSample.Controls"
        xmlns:converter="using:RatingControlSample.Converter"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Design.PreviewWith>
        <StackPanel Spacing="10">
            <controls:RatingControl Value="0" NumberOfStars="5" />
            <controls:RatingControl Value="2" NumberOfStars="5" />
            <controls:RatingControl Value="6" NumberOfStars="6" />
        </StackPanel>
    </Design.PreviewWith>

通过selector定义名字,具体名称="控件名.名称",不带名字则表示该类控件全部生效

<Style Selector="TextBlock.txt">
      <Setter Property="FontSize" Value="24"/>
      <Setter Property="FontWeight" Value="Bold"/>
</Style>

通过classes来使用样式,支持以空格分割的样式类,可以组合多个样式

<TextBlock Classes="txt xxx yyy" Text="TextBlock"/>

也支持代码增加删除样式:

在其他文件中引用样式,添加StyleInclude进行引用,设置Source属性

 6.样式主题

有时候我们可以需要把多个样式组合起来一起使用, 定义一个主题,比如Dark主题,Light主题、Mac主题、Win主题等
下面我们定义俩个文件夹。里面都新增一个Styles文件
0
俩个文件这俩个颜色设置为不同的,便于区分
0
0
然后定义俩个主题文件, 这俩个类里面 include 各文件夹下的所有Style文件,
至于对应的cs文件,需要手动添加,同时继承Styles类。
全部代码如下图所示
0
0
接下来,我们就可以在启动的时候,通过判断不同的平台环境。来加载不同的样式资源
0
运行过程中也可以再次修改
var btnWindow = this.FindControl<Button>("btnWindow");
            btnWindow.Click += (s, e) =>
            {
                this.Styles.Clear();
                this.Styles.Add(new WindowsTheme());
            };

            var btnMacos = this.FindControl<Button>("btnMacos");
            btnMac.Click += (s, e) =>
            {
                this.Styles.Clear();
                this.Styles.Add(new MacosTheme());
            };

参考:https://www.cnblogs.com/mchuang/p/17326477.html

7.和WPF一样,WPF中MouseUp直接使用没有效果,avalonia中的PointerReleased事件也不能直接触发,需要调用AddHandler

           this.AddHandler(Button.PointerReleasedEvent, btnClose_PointerReleased/*事件调用函数*/, Avalonia.Interactivity.RoutingStrategies.Bubble, true);

 8.在Styles中使用触发器

如下代码功能是鼠标悬浮在类名为rightDirection的按钮的子控件Border上背景变红,此处Border是重写了Button的Template里面加了Border。

  <Style Selector="Button.rightDirection>Border:pointerover">
    <Setter Property="Background" Value="Red"></Setter>
  </Style>

 9.按钮想要高度适应父控件,WPF Grid Row的高度是* 就可以了,但是avalonia好像不行,需要设置VerticalAlignment="Stretch"

    <Button Name="btnRight"  Classes="rightDirection" Margin="0" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2"  VerticalAlignment="Stretch"></Button>

 10、又遇到了一个问题,在后台使用 this.DataContext=new ViewModel();貌似绑定没生效。

 this.DataContext = _viewmodel = new MainWindowViewModel();//这样没生效
//下面这样就生效了在Xaml里面写
  <Design.DataContext>
    <vm:MainWindowViewModel></vm:MainWindowViewModel>
  </Design.DataContext>
  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Avalonia是一个**跨平台的UI框架,用于创建桌面应用程序**。 以下是一些关于Avalonia的基本信息和学习资源: 1. **什么是Avalonia?**:Avalonia是一个基于WPF XAML的开源UI框架,它允许开发者使用.NET构建跨平台的桌面应用程序。Avalonia支持多种操作系统,包括Windows、Linux和macOS。 2. **准备工作**:在开始使用Avalonia之前,你需要安装相应的开发环境,并配置项目。这通常包括安装.NET SDK和Avalonia工具包。 3. **创建第一个Avalonia应用程序**:你可以通过官方文档或相关教程来创建你的第一个Avalonia应用,这将帮助你理解基本的应用程序结构和开发流程。 4. **XAML基础**:XAML是一种用于定义用户界面的语言,你可以学习如何使用XAML来创建界面布局和实现数据绑定。 5. **控件和样式**:Avalonia提供了丰富的控件库,你可以学习如何使用这些控件以及如何通过样式和模板来自定义它们的外观。 6. **MVVM模式**:MVVM(Model-View-ViewModel)是一种设计模式,用于分离应用程序的业务逻辑和界面表示。学习MVVM将有助于你构建可维护和可测试的应用程序。 7. **导航和多窗口**:了解如何在Avalonia中进行窗口导航和管理多个窗口,这对于构建复杂的桌面应用程序非常重要。 8. **打包和发布应用程序**:最后,你需要学习如何将你的Avalonia应用程序打包和发布,以便用户可以在他们的计算机上安装和使用你的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值