首页 > 其他分享 >Avalonia-实现控件出现时上升效果(简单)

Avalonia-实现控件出现时上升效果(简单)

时间:2024-07-24 16:42:24浏览次数:20  
标签:控件 效果 动画 样式 设置 Rectangles Avalonia

Avalonia实践-实现控件出现时上升效果


最近在学习 Avalonia,看到WinUI里有个经典的出现时上升样式,拿来练练手同时学习 Style 和 Animation

目标效果是下面这样

image

Demo

使用版本: Avalonia (11.0.10) CommunityToolkit.Mvvm (8.2.1)
简单用 CommunityToolKit.MVVM 写了一下代码

MainWindowViewModel.cs

using Avalonia.Controls.Shapes;
using Avalonia.Media;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;

namespace StyleSample.ViewModels;

public partial class MainWindowViewModel : ViewModelBase
{
    public ObservableCollection<Rectangle> Rectangles { get; } = [];

    [RelayCommand]
    private void AddRectangle()
    {
        Rectangles.Add(new Rectangle() { Width = 50, Height = 50, Fill = Brushes.Blue, Margin = new(10) });
    }

    [RelayCommand]
    private void RemoveOneRectangle()
    {
        if (Rectangles.Count > 0) Rectangles.RemoveAt(0);
    }
    [RelayCommand]
    private void RemoveAllRectangle()
    {
        Rectangles.Clear();
    }
}

MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:StyleSample.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        x:Class="StyleSample.Views.MainWindow"
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="StyleSample" Width="550"  Height="300">

  <Window.Styles>
	<!-- 具体样式放到后面 -->
  </Window.Styles>

  <Grid ColumnDefinitions="*,Auto" Margin="20">
    <!-- 放矩形的容器 -->
    <ItemsControl ItemsSource="{Binding Rectangles}" VerticalAlignment="Center" Background="Cyan">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <WrapPanel />
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    </ItemsControl>
    
	<!-- Button -->
    <StackPanel Spacing="10" Grid.Column="1" VerticalAlignment="Center" Margin="10">
      <Button HorizontalAlignment="Stretch" Command="{Binding AddRectangleCommand}">Add one</Button>
      <Button HorizontalAlignment="Stretch" Command="{Binding RemoveOneRectangleCommand}">Remove one</Button>
      <Button HorizontalAlignment="Stretch" Command="{Binding RemoveAllRectangleCommand}">Remove all</Button>
    </StackPanel>
  </Grid>

</Window>

下面就是实现具体样式了

  <Window.Styles>
	
    <Style Selector="Rectangle[IsVisible=True]">
      <Style.Animations>
        <Animation Duration="0:0:0.7" IterationCount="1" Easing="ExponentialEaseOut" >
          <KeyFrame Cue="0%">
            <Setter Property="TranslateTransform.Y" Value="20"/>
            <Setter Property="Opacity" Value="0.0"/>
          </KeyFrame>
        </Animation>
      </Style.Animations>
    </Style>
	
  </Window.Styles>

最终实现效果

image

Avalonia 可以像 css 一样选择特定的对象,然后指定相应的样式,且样式之间可以覆盖

我的实现方式是直接使用动画,设置动画的初始状态为往下偏移 20px,结束状态则是本来的位置
这样在方块展示时就可以直接触发动画,然后返回初始位置

下面介绍样式中的每一个参数

Selector

<Style Selector="Rectangle[IsVisible=True]">
	...
</Style>

指定选择的控件为矩形;[IsVisible=True] 选择控件可见时展示
可以看 样式选择器语法 | Avalonia Docs ,下面列出三个例子

  • 按名称选择 <Style Selector="Button#myButton">
  • 按伪类选择 <Style Selector="Button:focus"> 伪类(Pseudoclasses) | Avalonia Docs
  • 子操作符 <Style Selector="StackPanel > Button"> StackPanel 下的直接子控件 Button

Animation

<Style.Animations>
	<Animation Duration="0:0:0.7" IterationCount="1" Easing="ExponentialEaseOut" >
		...
	</Animation>
</Style.Animations>
  • 使用 Style.Animations 元素来包含动画。
  • 添加一个 Animation 元素,并设置其动画时长 Duration ,格式为 时:分:秒
  • 设置重复次数 IterationCount
  • 设置动画函数 Easing ,可以在这里找 动画设置 | Avalonia Docs 看到了合适的可以直接拿过来用

KeyFrame

<KeyFrame Cue="0%">
    <Setter Property="TranslateTransform.Y" Value="20"/>
    <Setter Property="Opacity" Value="0.0"/>
</KeyFrame>

设置关键帧,关键帧从 0% - 100%,如何使用关键帧动画 | Avalonia Docs
在开始时向原来的位置向下偏移 20px,然后结束时没有设置,默认是原属性,这样就实现了动画
至于有哪些 Transform 属性可以使用不是特别清楚,应该可以在 Avalonia UI Framework - API - ITransform Interface 找一下
image

尾声

ITransform 的实现类不是很清楚,导致在设置关键帧属性时没有参考,翻了挺久的官方文档也没有具体说明有哪些可以用

Avalonia 中文文档

标签:控件,效果,动画,样式,设置,Rectangles,Avalonia
From: https://www.cnblogs.com/HUOE/p/18321201

相关文章

  • 2024-07-24 记录一则切换页面背景颜色效果
    效果:点击切换按钮,背景色由白色变成黑色,从指定的地方开始过渡 点击按钮:<divref="themeBtn"@click="changeTheme">点击切换</div>切换逻辑://主题切换按钮constthemeBtn=ref(null);/*改变颜色*/constchangeTheme=()=>{//创建一个过渡对象const......
  • 易优CMS模板标签uibackground背景图片在模板文件index.htm中调用uibackground标签,实现
    【基础用法】标签:uibackground描述:背景图片上传标签,使用时结合html一起才能完成可视化布局,只针对具有可视化功能的模板。用法:<divclass="eyou-edit"e-id="文件模板里唯一的数字ID"e-page='文件模板名'e-type="background"style="background-image:url({eyou:uibackgrounde......
  • Avalonia开发实践(三)——GroupBox
    一、开发背景近期在项目中要用到GroupBox,结果发现Avalonia原生框架中竟然没有这一控件。想着这个控件也不算复杂,索性就自己实现一个好了。二、坑的开始熟悉桌面开发的朋友一定对下面这个经典的GroupBox样式不陌生—— 这个样式看似简单,实则也不难实现。只要解决对标题处......
  • 界面控件开发包DevExpress v24.1.4全新发布
    DevExpress Universal拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress近期重要版本v24.1已正式发布,该版本拥有众多新产品和数十个具有......
  • Newtonsoft 特性[JsonIgnore ] 对于继承属性的神奇效果
    阅读前请有点基础[JsonIgnore]publicDateTimeCreateTimccc{get;set;}一般用Newtonsoft序列化类时候,如果不要序列化这个属性,在上面加这个特性就好了(ps.这个特性和Newtonsoft和Text.Json的名称重复,注意不要搞错)定义子类和父类,用隐藏基类......
  • 《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
    ......
  • .NET跨平台UI框架Avalonia 11.1重磅发布
    本篇为译文原文地址 https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-developmentgithub地址 https://github.com/AvaloniaUI/Avalonia 史蒂文·柯克发布于7月22日我们很高兴地宣布发布Avalonia11.1,这是对我们喜爱的跨平台UI框......
  • C#开发的全屏图片切换效果应用 - 开源研究系列文章 - 个人小作品
          这天无聊,想到上次开发的图片显示软件《PhotoNet看图软件》,然后想到开发一个全屏图片切换效果的应用,类似于屏幕保护程序,于是就写了此博文。这个应用比较简单,主要是全屏切换换图片效果的问题。 1、项目目录;  2、源码介绍;1)类库部分源码;......
  • html+css 简易摩天轮效果
    vuedom<divclass="ferris_wheel"><divclass="wheelBg"></div><divclass="wheelBox"><divclass="bg"></div><ulclass="list">......
  • 用python制作终端向上滑动的效果
    我正在开发一个项目,需要时需要过渡效果。我正在通过CRT终端模拟器“cool-retro-term”运行这个python项目。我想让它像老式CRT终端一样,屏幕平滑地向上滑动所有字符以呈现下一行或刷新屏幕。像这样:终端滑动效果不是单独打印的字符,而是屏幕的滚动。到目......