Avalonia中如何实现文件拖拽上传

前言

前面我们讲了在Avalonia中如何将View事件映射到ViewModel层感兴趣的读者可以看一下,本章我们将讲一下在Avalonia框架下如何实现文件和文字的拖拽到指定区域进行处理和上传。

先看效果

在这里插入图片描述
界面设计比较简单,还是在前一张的基础上加了一个指定区域,这个区域负责接收我们拖拽上面的内容。

方案一

第一种方案是通过后台代码的方式给指定控件注册相关AddHandler方法动态注册DragDrop.DropEvent,代码如下:

        public ViewB(){InitializeComponent();b1.AddHandler(DragDrop.DropEvent, Drop);}private void Drop(object sender, DragEventArgs e){Debug.WriteLine("Drop");if (e.Data.Contains(DataFormats.Text))_DropState.Text = e.Data.GetText();else if (e.Data.Contains(DataFormats.FileNames))_DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());else if(e.Data.Contains(DataFormats.Files))_DropState.Text = string.Join(Environment.NewLine, e.Data.GetFiles().Select(u=>u.Name));}

展示效果如下:
在这里插入图片描述
这种模式破坏了MVVM模式,感觉不是太完美。

方案二

通过自定义Handle处理来处理,我们通过定义FileDropHandler来统一处理拖拽上来的信息,处理方式如下:

using Avalonia.Input;
using Avalonia.Xaml.Interactions.DragAndDrop;
using AvaloniaTest.ViewModels;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AvaloniaTest.Behaviors
{public class FileDropHandler: DropHandlerBase{public override void Drop(object? sender, DragEventArgs e, object? sourceContext, object? targetContext){if (!(targetContext is ViewBViewModel)){return;}var vm = (ViewBViewModel)targetContext;var type = e.Data.GetType();var i = e.Data.GetText();vm.FileName = i;var file = e.Data.GetFiles();if (file == null){return;}var names = file.Select(x => x.Name).ToList();vm.FileName = string.Join(Environment.NewLine, names);e.Data.ToString();}public override bool Execute(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state){return base.Execute(sender, e, sourceContext, targetContext, state);}public override void Enter(object? sender, DragEventArgs e, object? sourceContext, object? targetContext){base.Enter(sender, e, sourceContext, targetContext);}public override bool Validate(object? sender, DragEventArgs e, object? sourceContext, object? targetContext, object? state){return true;}}
}

前端代码如下:

<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:prism="http://prismlibrary.com/"xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions"xmlns:idd="clr-namespace:Avalonia.Xaml.Interactions.DragAndDrop;assembly=Avalonia.Xaml.Interactions.DragAndDrop"xmlns:b="using:AvaloniaTest.Behaviors"prism:ViewModelLocator.AutoWireViewModel="True"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="AvaloniaTest.Views.ViewB" Background="Green"><i:Interaction.Behaviors><ia:EventTriggerBehavior EventName="Loaded"><ia:InvokeCommandAction Command="{Binding OnLoad}"></ia:InvokeCommandAction></ia:EventTriggerBehavior></i:Interaction.Behaviors><UserControl.Styles><Style Selector="Border.FileDragAndDrop1"><Style.Resources><b:FileDropHandler x:Key="FileDropHandler" /></Style.Resources><Setter Property="(i:Interaction.Behaviors)"><i:BehaviorCollectionTemplate><i:BehaviorCollection><idd:ContextDropBehavior Handler="{StaticResource FileDropHandler}" /></i:BehaviorCollection></i:BehaviorCollectionTemplate></Setter></Style></UserControl.Styles><StackPanel><TextBlock Text="{Binding Title}"></TextBlock><Border BorderThickness="1" BorderBrush="White" Width="100" Height="100" DragDrop.AllowDrop="True" CornerRadius="20"  Classes="FileDragAndDrop" Cursor="DragMove" Name="b1"><Grid><TextBlock Text="Drag" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" FontSize="20"></TextBlock></Grid></Border><TextBlock x:Name="_DropState"></TextBlock><TextBlock Text="{Binding FileName}"></TextBlock></StackPanel></UserControl>

ViewModel代码如下:

using Avalonia.Input;
using Prism.Commands;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AvaloniaTest.ViewModels
{public class ViewBViewModel : ViewModelBase, INavigationAware{private string _title = "ViewB";public string Title{get => _title;set{SetProperty(ref _title, value);}}private string _FileName;public string FileName{get => _FileName;set{SetProperty(ref _FileName, value);}}public bool IsNavigationTarget(NavigationContext navigationContext){return true;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}private DelegateCommand _onLoad;public DelegateCommand OnLoad => _onLoad ?? (_onLoad=new DelegateCommand(() => {Debug.WriteLine("OnLoad is run!");}));public void Grid_Click(object sender, object e){try{Debug.WriteLine("click触发");}catch (System.Exception){}}public void FilesDataGrid_Drop(object sender, DragEventArgs e){Debug.WriteLine(e.ToString());}}
}

看运行效果一样:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GDPU 数据结构 天码行空13

文章目录 一、【实验目的】二、【实验内容】三、实验源代码四、实验结果五、实验总结 一、【实验目的】 (1) 理解插入排序算法的实现过程&#xff1b; &#xff08;2&#xff09;理解不同排序算法的时间复杂度及适用环境&#xff1b; &#xff08;3&#xff09;了解算法性能…

入门指南:使用Prometheus监控Linux服务器

Prometheus介绍 Prometheus是一款开源的监控系统&#xff0c;主要用于收集、存储和查询时间序列数据&#xff0c;以便于对系统进行监控和分析。以下是Prometheus的架构图介绍&#xff1a; Prometheus的架构由四个主要组件组成&#xff1a; Prometheus Server&#xff08;Prom…

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…

Spring(Spring/Springboot 的创建) 基础

一. Spring 1.1 Spring是什么&#xff1f; Spring 指的是 Spring Frameword(Spring 框架),它是一个开源框架。 Spring 是包含了众多工具方法的IoC容器。 1.2 什么是容器&#xff1f; 容器时用来容纳某种物品的装置。 我们之前接触到的容器&#xff1a; • List/Map ->…

【深度学习】强化学习(一)强化学习定义

文章目录 一、强化学习问题1、交互的对象1. 智能体&#xff08;Agent&#xff09;2. 环境&#xff08;Environment&#xff09; 2、强化学习的基本要素1. 状态 &#x1d460;2. 动作 &#x1d44e;3. 策略 &#x1d70b;(&#x1d44e;|&#x1d460;)4. 状态转移概率 &#x1…

[HITCON 2017]SSRFme perl语言的 GET open file 造成rce

这里记录学习一下 perl的open缺陷 这里首先本地测试一下 发现这里使用open打开 的时候 如果通过管道符 就会实现命令执行 然后这里注意的是 perl 中的get 调用了 open的参数 所以其实我们可以通过管道符实现命令执行 然后这里如果file可控那么就继续可以实现命令执行 这里就…

用23种设计模式打造一个cocos creator的游戏框架----(一)生成器模式

1、模式标准 模式名称&#xff1a;生成器模式 模式分类&#xff1a;创建型 模式意图&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 结构图&#xff1a; 适用于&#xff1a; 当创建复杂对象的算法应该独立于该对象的…

⭐Unity 搭建UDP客户端(01) 配合网络调试助手测试

1.接收来自服务器的消息 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine;public class UDPManager:MonoBehaviour {public string recvStr; //服务器返回值public string UDPClientAddRess "192.168.2.39&q…

儿童护栏围栏CE认证EN1930检测标准

儿童门护栏也叫儿童游戏围栏&#xff0c;游戏围栏和儿童护栏&#xff0c;安全护栏等。市面上的儿童围栏以塑料&#xff0c;木质材料结构为主。主要作用是为了解放妈妈的双手&#xff0c;提供一个安全舒适的环境给6个月-3岁的宝宝。使用儿童围栏有利于培养宝宝的独立意识&#x…

深入探索C语言中的二叉树:数据结构之旅

引言 在计算机科学领域&#xff0c;数据结构是基础中的基础。在众多数据结构中&#xff0c;二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构&#xff0c;每个节点最多有两个子节点&#xff1a;左子节点和右子节点。这种结构使得搜索、插入、删除等操作…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

概率测度理论方法(第 2 部分)

一、说明 欢迎回到这个三部曲的第二部分&#xff01;在第一部分中&#xff0c;我们为测度论概率奠定了基础。我们探索了测量和可测量空间的概念&#xff0c;并使用这些概念定义了概率空间。在本文中&#xff0c;我们使用测度论来理解随机变量。 作为一个小回顾&#xff0c;在第…