首页 > 编程语言 >[C#] [WPF] 在MVVM中实现拖拽功能 - 入门

[C#] [WPF] 在MVVM中实现拖拽功能 - 入门

时间:2024-05-15 11:08:56浏览次数:15  
标签:控件 string MVVM C# DoDragDrop source WPF 拖拽 DragDropEffects

拖拽功能是使用频率较高的一种交互, 用传统方法去写很简单, 但是在mvvm规则下, 也没必要弄得很麻烦
我的入门案例就选择了使用mvvm重写tutorialspoint - Interaction里的调色盘案例, view如下
image

MainWindow.xaml

这里的重点是控件要允许拖拽以及对应的事件
目标控件, 填充色绑定, 允许drop, drop方法

<!-- #region target-->
<Rectangle
    AllowDrop="True"
    Drop="TargetRect_Drop"
    Fill="{Binding FillColor}"/>
<!--#endregion-->

来源控件, 因为要拖动, 所以用MouseMove

<!--#region source-->
<Rectangle
    Fill="Beige"
    MouseMove="SourceRect_MouseMove" />
<!--#endregion-->

MainWindow.xaml.cs

在这里, 就是写事件的主要逻辑
1️⃣ 首先, 设置一个全局变量

MainWindowViewModel MainVM;

2️⃣然后写方法

// drop方法
private void TargetRect_Drop(object sender, DragEventArgs e)
{
	// GetDataPresent: 检查e.Data是否可以转换为string格式来存储
	if (e.Data.GetDataPresent(DataFormats.StringFormat))
	{
		// GetData: 将数据转化为string格式, 注意将DataObject类型强制转为string
		string color = (string)e.Data.GetData(DataFormats.StringFormat);
		// 赋值
		MainVM.FillColor = color;
		//MainVM.FillColorName = (Color)ColorConverter.ConvertFromString(MainVM.FillColor);
	}
}

然后是MouseMove

// drag方法: 鼠标左键点击并拖动时触发, 因为要拖动,所以需要一个MouseMove事件
private void SourceRect_MouseMove(object sender, MouseEventArgs e)
{
    // 按下左键
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        // 指定sender
        Rectangle source = sender as Rectangle;
        // 拖动方法DargDrop.DoDragDrop
        DragDrop.DoDragDrop(source, source.Fill.ToString(), DragDropEffects.Copy);
    }
}

MainViewModel.cs

简简单单声明一下要用的变量

[ObservableProperty]
private string _fillColor = "AliceBlue";

关于DragDrop.DoDragDrop

应该是拖拽行为中比较重要的方法(看了好多都是用这个)
官方文档: https://learn.microsoft.com/en-us/dotnet/api/system.windows.dragdrop.dodragdrop?view=windowsdesktop-8.0

⭐省流: 意思就是这个方法需要指定来源, 传输的数据还有效果, 数据会被自动封装 (目标引用数据的话可以用e.Data.GetData啥的), 返回的就是传入的拖拽效果enum值⭐

用处: 启动一次拖拽行为

// 如果dragSource或data为null, 则报错
public static System.Windows.DragDropEffects DoDragDrop (
	System.Windows.DependencyObject dragSource, 
	object data, 
	System.Windows.DragDropEffects allowedEffects);

参数:
dragSource ➡️ 指代被拖拽的对象
data ➡️ 包含传输数据的data对象
allowedEffects ➡️ 行为中允许的拖拽效果, 来自DragDropEffects之中的某个值

返回: 拖拽行为中最终效果, 同样来自DragDropEffects

DragDrop.DoDragDrop(
	source, 
	source.Fill.ToString(), 
	DragDropEffects.Copy)

source代表被拖拽的控件/对象, 传输的是source的Fill属性, 并且会被自动封装进DataObject中

DragDropEffects - Enum
(不想写了了直接放图)
image

标签:控件,string,MVVM,C#,DoDragDrop,source,WPF,拖拽,DragDropEffects
From: https://www.cnblogs.com/Akira300000/p/18166011

相关文章

  • Unrecognized option: --add-opens java.base/java.lang=ALL-UNNAMED
    由于Java中有关反射相关的功能自从JDK9就开始进行了限制,因此如果还想继续在JDK9以及更高的版本中使用反射相关的功能,需要添加JVM启动参数,--add-opensjava.base/java.lang=ALL-UNNAMED。由于现在的项目都是用Docker部署的,所以紧接着在DockerFile中添加了这个JVM启动参数,如下......
  • 使用.net 6.0框架的WPF应用如何引用System.Windows.Forms这个dll
    先说结论:能用.nerfx尽量用fx开发,因为很多坑之前的前辈帮你踩过了。。。解决方法是在这个目录下找到你对应版本的System.Windows.Forms这个dllC:\ProgramFiles\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.26\ref\net6.0这个目录每个人版本不一样,想找到最简单的方法就......
  • Percona XtraBackup全备与增量备份脚本
    1、全备脚本#!/bin/bashBAK_DIR_ROOT="/mysql/backup"MYSQL_USERNAME="root"MYSQL_PASSWORD="root"MYSQL_CNF="/mysql/data/3306/my.cnf"BAK_FULL_DIR=$BAK_DIR_ROOT/mysqlbackup`(date+%Y%m%d)`/mysqlfullbackupBAK_LOG="......
  • Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略
    CiscoIdentityServicesEngine(ISE)3.3Patch2-基于身份的网络访问控制和策略实施系统思科身份服务引擎(ISE)-下一代NAC解决方案请访问原文链接:CiscoIdentityServicesEngine(ISE)3.3Patch2-基于身份的网络访问控制和策略实施系统,查看最新版。原创作品,转载......
  • Oracle Linux 9.4 正式版发布 - Oracle 提供支持 RHEL 兼容发行版
    OracleLinux9.4正式版发布-Oracle提供支持RHEL兼容发行版OracleLinuxwithUnbreakableEnterpriseKernel(UEK)&RedHatcompatiblekernel(RHCK)请访问原文链接:OracleLinux9.4正式版发布-Oracle提供支持RHEL兼容发行版,查看最新版。原创作品,转载请保留出......
  • Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版
    RockyLinux9.4正式版发布-RHEL100%1:1兼容免费发行版RockyLinux由CentOS项目的创始人GregoryKurtzer领导请访问原文链接:RockyLinux9.4正式版发布-RHEL100%1:1兼容免费发行版,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org以社区方式驱动的企......
  • RetryableException: Read timed out executing导致服务假死无响应
    最近发现Plan这个微服务经常会无响应,后来发现是task微服务会调用plan的某个接口,经常报错如下异常,然后timeout后又30秒再次发起重试而这个业务处理时间1分钟-2小时都有可能所以把plan微服务线程池占满导致无响应2024-05-1314:27:00.282N/A,b1f2a3468b14468abef240bfeddd8b95,0......
  • THUSC&PKUSC2024游记
    Day-infCSP-S200,NOIP289。Day-inf过了PKUWC,100+11+10+100+28+18=267,低于大众分,喜提二等。Day-inf竟然过了THUSC和PKUSC,神奇。lhr也过了,可惜zyj没过QwQ。Day-1zby玩我的魔方被收了,难蚌。Day0五点半起床,坐动车,做到晚上五点才到余姚,好累啊。和lhr去......
  • Clickhouse常用整理& linux操作clickhouse命令
    进入click(不加上-m的话,进入之后只能一次写一行,不能建表)clickhouseclient-m 查看数据库showdatabases;创建一个数据库createdatabasedb_doit; 删除数据库dropdatabasedb_doit;查看表showtables;查看当前使用的数据库selectcurrentDatabas......
  • k8s nodeName与nodeSelector的简单应用(转)
    原文:https://blog.csdn.net/xhredeem/article/details/127687465作者:xhredeem来源:CSDN默认情况下,k8smaster管理节点有污点标签,默认是NoSchedule,即不会被调度。新创建的pod会随机选择除了master管理节点的以外的node工作节点上创建。如果想要使某个新建pod在某个node节点创建......