跨平台WPF框架Avalonia教程 六

添加交互性

用户界面的一个基本功能是与用户进行交互。在Avalonia中,您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。

处理事件​

Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处理事件:

  1. 实现事件处理程序:在code-behind中编写一个事件处理程序,当事件被触发时将执行该处理程序。事件处理程序应包含您希望对事件响应时执行的逻辑。

MainWindow.axaml.cs

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void HandleButtonClick(object sender, RoutedEventArgs e){// Event handling logic goes here}
}

  1. 订阅事件:在控件中确定您要处理的事件。Avalonia中的大多数控件都会公开各种事件,比如ClickSelectionChanged。在XAML中订阅事件,定位控件并添加一个属性,属性名为事件的名称,值为事件处理程序方法的名称。

MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="AvaloniaApplication1.Views.MainWindow"><Button Name="myButton" Content="Click Me" Click="HandleButtonClick" />
</Window>

上面的示例在ButtonClick事件上添加了一个名为HandleButtonClick的处理程序。

使用命令​

Avalonia中的命令提供了一种更高级的方式来处理用户交互,将用户操作与实现逻辑解耦。与事件在控件的code-behind中定义不同,命令通常绑定到数据上下文上的属性或方法。

信息

命令在所有提供Command属性的控件中都可用。通常,在控件的主要交互方法发生时,例如按钮点击时触发命令。

使用命令的最简单方法是将其绑定到对象数据上下文中的方法。

  1. 在视图模型中添加方法:在视图模型中定义一个处理命令的方法。

    public class MainWindowViewModel
    {public bool HandleButtonClick(){// Event handling logic here}
    }
    

  2. 绑定方法:将方法与触发它的控件关联起来。

    <Button Content="Click Me" Command="{Binding HandleButtonClick}" />

资产(Assets)

许多应用程序需要包含位图、样式和资源字典等资产。资源字典包含可以在XAML中声明的图形基础元素。样式也可以用XAML编写,但位图资产是二进制文件,例如PNG和JPEG格式的图像。

包含资产​

您可以通过在项目文件中使用<AvaloniaResource>元素来将资产包含在应用程序中。

例如,Avalonia .NET Core MVVM应用程序解决方案模板会创建一个名为Assets的文件夹(包含avalonia-logo.ico文件),并在项目文件中添加一个元素来包含其中的任何文件,如下所示:

<ItemGroup><AvaloniaResource Include="Assets\**"/>
</ItemGroup>

您可以通过在该项组中添加额外的<AvaloniaResource>元素来包含所需的任何文件。

提示

这里的元素名AvaloniaResource只表示这些资源将在构建过程中以.NET资源的形式进行内部存储。但是,在 Avalonia UI 中,这些文件被称为“资产(Assets)”以区别于“XAML资源(XAML resources)”。

引用包含的资产​

一旦资产文件被包含,您可以根据需要在定义用户界面的XAML中引用它们。例如,可以通过指定相对路径来引用这些资产:

<Image Source="icon.png"/>
<Image Source="images/icon.png"/>
<Image Source="../icon.png"/>

或者,您可以使用根路径:

<Image Source="/Assets/icon.png"/>

库资产​

如果资产包含在与XAML文件不同的程序集中,则可以使用 avares: URI方案。例如,如果资产包含在名为MyAssembly.dll的程序集中的Assets文件夹中,则可以使用:

<Image Source="avares://MyAssembly/Assets/icon.png"/>

资产类型转换​

Avalonia UI内置了用于加载位图、图标和字体资产的转换器。因此,资产URI可以自动转换为以下任意一种类型:

  • 图像 - Image 类型
  • 位图 - Bitmap 类型
  • 窗口图标 - WindowIcon 类型
  • 字体 - FontFamily 类型

在代码中加载资产​

您可以编写代码来使用AssetLoader静态类加载资产。例如:

var bitmap = new Bitmap(AssetLoader.Open(new Uri(uri)));

上面代码中的uri变量可以包含任何带有avares:方案的有效URI(如上所述)。

Avalonia UI 不支持 file://http://或 https:// 等方案。如果要从磁盘或Web加载文件,您必须自己实现该功能或使用社区提供的实现。

信息

Avalonia UI社区提供了一个图像加载器实现,地址是 https://github.com/AvaloniaUtils/AsyncImageLoader.Avalonia

动画

Avalonia UI 中有两种类型的动画:

  • 关键帧动画:可以在时间轴上的关键帧处改变一个或多个属性的值。关键帧在时间轴上的关键点上定义。在关键帧之间使用缓动函数(默认情况下是直线插值)调整正在更改的属性。关键帧动画是一种非常灵活的动画类型。
  • 过渡动画:可以改变一个单一属性的值。

关键帧动画​

最简单的关键帧动画将在指定的持续时间内通过在开始时(持续时间的0%)和结束时(持续时间的100%)定义两个关键帧来更改一个属性的值。

然后,属性值在关键帧之间随时间改变,使用由缓动函数定义的配置文件。默认的缓动函数也是最简单的 - 在两个关键帧之间进行直线插值。

信息

您可以在参考文档中查看所有缓动函数的完整范围,地址.

触发动画​

在XAML中定义的 Avalonia UI 动画依赖于选择器来触发其行为。选择器总是可以应用于一个控件,或者它们可以有条件地应用(例如,控件已经应用了样式类)。

如果选择器不是有条件的,那么当匹配的 Control 添加到可视树时,动画将被触发。否则,动画将在其选择器被激活时运行。当选择器不再匹配时,当前正在运行的动画将被取消。

其他动画设置​

  • 延迟 - Delay
  • 重复次数 - Repeat
  • 播放方向 - Playback Direction
  • 值填充模式 - Value Fill Mode
  • 缓动函数 - Easing Function

 

 

文件对话框

文件对话框功能可以通过 StorageProvider 服务 API 访问,该服务 API 可在 Window 或 TopLevel 类中获取。本页面仅展示基本用法,有关此 API 的更多信息,请查阅 StorageProvider 页面。

信息

如果要查看这些概念在实际运行中的完整示例,请参阅 示例应用程序

OpenFilePickerAsync​

此方法打开一个文件选择器对话框,允许用户选择文件。FilePickerOpenOptions 定义了传递给操作系统对话框的选项。

public class MyView : UserControl
{private async void OpenFileButton_Clicked(object sender, RoutedEventArgs args){// 从当前控件获取 TopLevel。或者,您也可以使用 Window 引用。var topLevel = TopLevel.GetTopLevel(this);// 启动异步操作以打开对话框。var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions{Title = "Open Text File",AllowMultiple = false});if (files.Count >= 1){// 打开第一个文件的读取流。await using var stream = await files[0].OpenReadAsync();using var streamReader = new StreamReader(stream);// 将文件的所有内容作为文本读取。var fileContent = await streamReader.ReadToEndAsync();}}
}


SaveFilePickerAsync​

此方法打开一个文件保存对话框,允许用户保存文件。FilePickerSaveOptions 定义了传递给操作系统对话框的选项。

示例​

public class MyView : UserControl
{private async void SaveFileButton_Clicked(object sender, RoutedEventArgs args){// 从当前控件获取 TopLevel。或者,您也可以使用 Window 引用。var topLevel = TopLevel.GetTopLevel(this);// 启动异步操作以打开对话框。var file = await topLevel.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions{Title = "Save Text File"});if (file is not null){// 打开文件的写入流。await using var stream = await file.OpenWriteAsync();using var streamWriter = new StreamWriter(stream);// 将一些内容写入文件。await streamWriter.WriteLineAsync("Hello World!");}}
}

有关 StorageProvider 服务的更多信息,包括如何保持对选定文件的访问以及支持哪些可能的选项,请访问 StorageProvider 文档页面和子页面。

备注

为了学习目的,提供的示例直接在 ViewModel 中访问 StorageProvider API。在实际的应用程序中,建议遵循 MVVM 原则,通过创建服务类并使用依赖注入/控制反转 (DI/IoC) 来定位它们。请参阅 IoCFileOps 和 DepInject 项目,查看如何实现这一功能的示例。

多点触控

与其他一些框架不同,Avalonia UI 不区分触摸事件。相反,它使用一个指针事件系统,将鼠标、笔和触摸事件统一起来。这意味着您不需要单独的 TouchEnter 或 TouchLeave 事件,而是可以使用 PointerPressedPointerMoved 和 PointerReleased 事件来跟踪触摸输入。

使用手势识别器​

除了基本的触摸事件外,Avalonia 还提供了内置的手势识别器,可以轻松处理常见的触摸手势,如捏合和滚动。以下是如何使用它们:

<Image Stretch="UniformToFill"Margin="5"Name="PinchImage"Source="/Assets/delicate-arch-896885_640.jpg"><Image.GestureRecognizers><PinchGestureRecognizer/><ScrollGestureRecognizer CanHorizontallyScroll="True" CanVerticallyScroll="True"/></Image.GestureRecognizers>
</Image>

在这个例子中,一个 Image 控件被设置为响应捏合和滚动手势。PinchGestureRecognizer 启用了捏合缩放功能,而 ScrollGestureRecognizer 允许图像在水平和垂直方向上滚动。

消息框

目前,Avalonia 尚未提供原生的 消息框(MessageBox) 组件。我们正在考虑在未来开发这一功能,以不断扩展和增强我们工具包的能力。需要消息框 功能的开发者可以探索以下第三方解决方案。

我们邀请您参考我们在 GitHub 仓库中的issue ,以获取有关 Avalonia UI 中 MessageBox 功能的最新更新和讨论。

第三方 MessageBox 实现​

  • Actipro Avalonia UI Controls
  • DialogHost.Avalonia
  • MessageBox.Avalonia

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18105.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…

药界互联:中药实验管理的网络化

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

【Linux】进程字段、环境变量与进程地址空间

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

基于isSpring的PPT转换

背景 PPT课件目前还是一项在教学中高度频繁使用的工具&#xff0c;对于在线教学就更为重要了。如何把PPT转换为在线web&#xff0c;同时保留更多的PPT特性&#xff08;动画、音效、视频&#xff09;呢&#xff1f;这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一…

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式&#xff0c;还极大地丰富了消费者的购物体验。随着技术的不断进步&#xff0c;AI在电商领域的应用越来越广泛&#xff0c;从个性…

【Linux】环境变量

目录 一、什么是环境变量: 1、系统命令搜索路径&#xff08;PATH&#xff09;&#xff1a; 2、HOME&#xff1a; 3、SHELL&#xff1a; 4、添加环境变量&#xff1a; 二、通过代码获取环境变量&#xff1a; 三、主函数参数&#xff1a; argc表&#xff1a; envp表&…

28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

密码算法简介 1.对称加密算法&#xff1a;加密和解密算法一样 2.非对称加密算法&#xff1a;公钥加密、私钥解密 3.摘要算法&#xff1a;不能解密&#xff0c;不可逆 简单介绍了解一下&#xff1a; 一、对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法…

如何用GPT-4o解读视频

OpenAI在去年推出的GPT-4V已经支持了多模态识别&#xff0c;但一直仅限于图片输入&#xff0c;不支持视频。相比之下&#xff0c;Google的Gemini早已支持视频识别。最近&#xff0c;我司业务场景中出现了一个需要识别视频的需求&#xff0c;而我们只采购了GPT-4o模型。这就引发…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面&#xff0c;有个名为vimrc 的文件&#xff0c;这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后&#xff0c;我们退出重新链接 再切换到普通用户下 再输入密码&#xff08;是不显示的&#xff0c;输入完后&#xff0c;…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 多文件同步上传、拖动上传、实时上传进度条、上传前的删除文件、原生file控件的美化 搁置的功能: 取消上传(上传过程中取消,即取消网络请求abort)、上传文件夹、大文件切片、以及很多限制条件未处理(重复上传、文件格式。。。) bug: 文件总大小(。。。竟然从d…

VScode学习前端-01

小问题合集&#xff1a; vscode按&#xff01;有时候没反应&#xff0c;有时候出来&#xff0c;是因为------>必须在英文状态下输入&#xff01; 把鼠标放在函数、变量等上面&#xff0c;会自动弹出提示&#xff0c;但挡住视线&#xff0c;有点不习惯。 打开file->pre…

Qwen2.5-3B-Instruct-GGUF部署

注册账号&#xff1a; 魔搭社区 等一会&#xff1a; 部署好了&#xff1a; 立即使用&#xff1a; 您部署的服务提供OpenAI API接口&#xff0c;可通过OpenAI SDK进行调用。请确保您的服务处于正常运行状态&#xff0c;并预先安装OpenAI SDK: pip install openai 在本地新建…

数据库管理-第262期 崖山:知其不可而为之(20241116)

数据库管理262期 2024-11-16 数据库管理-第262期 崖山&#xff1a;知其不可而为之&#xff08;20241116&#xff09;1 崖山之名2 绝地反击3 不止崖山总结 数据库管理-第262期 崖山&#xff1a;知其不可而为之&#xff08;20241116&#xff09; 作者&#xff1a;胖头鱼的鱼缸&am…

C语言:指针的变量运算及数组指针

1、指针的变量运算 指针变量保存的是地址&#xff0c;二地址本质上是一个整数&#xff0c;所以指针变量可以进行部分运算&#xff0c;列如加法减法、比较等&#xff0c;请看下面的代码&#xff1a; 1. #include <stdio.h> 2. 3. int main(){ 4. int a 10, *pa &a…

【高德地图】基本使用教程(玩转地图)(vue2+vue3)

简介 带大家一步步实现地图显示特定位置&#xff0c;或定位到当前位置。并且拖拽地图界面能够查询出指定位置周边的信息。通过关键字搜索周边信息。 本教程适合初学者。 一、获取使用高德api的key 打开高德开发平台&#xff0c;登录后&#xff0c;鼠标覆盖右上角头像&#…

统信UOS开发接口DTK

DTK(Development ToolKit)是基于 Qt 开发的简单且实用的通用开发框架。提供丰富的开发接口与支持工具,能有效提升开发效率。 文章目录 一、简介DTK 常见模块介绍概述二、框架创建开发环境准备使用 cmake三、常见模块窗口和对话框一、简介 DTK 常见模块介绍 概述 DTK(Dev…