Blazor入门100天 : 自做一个支持长按事件的按钮组件

好长时间没继续写这个系列博客了, 不知道大家还记得我吗? 话不多说,直接开撸.

配套源码
demo https://blazor.app1.es/b19LongPressButton

####1. 新建 net8 blazor 工程 b19LongPressButton

至于用什么模式大家各取所需, 我创建的是ssr单工程, 如果大家不小心建立错了按页面渲染模式,可以在 App.razor 里面改一下, 加入 @rendermode=“RenderMode.InteractiveServer” 这句话, 默认使用ssr模式渲染.

<Routes @rendermode="RenderMode.InteractiveServer" />

####2. Components\Pages 下新建组件 LongPressButton.razor

@inherits ComponentBase<div @onclick="onClick" @oncontextmenu="onContextMenu" @ontouchstart="OnTouchStart" @ontouchend="OnTouchEnd">@ChildContent
</div>@code {[Inject]private IJSRuntime? JS { get; set; }[Parameter]public RenderFragment? ChildContent { get; set; }/// <summary>/// 获得/设置 启用长按/// </summary>[Parameter]public bool LongPress { get; set; } = true;/// <summary>/// 获得/设置 ContextMenu 菜单项回调委托/// </summary>[Parameter]public Func<MouseEventArgs, Task>? OnContextMenu { get; set; }/// <summary>/// 获得/设置 长按回调委托, 如果启用长按并且不是触摸设备,则回落到 Click 点击时触发/// </summary>[Parameter]public Func<MouseEventArgs, Task>? OnLongPress { get; set; }/// <summary>/// 获得/设置 Click 回调委托/// </summary>[Parameter]public Func<MouseEventArgs, Task>? OnClick { get; set; }/// <summary>/// 获得/设置 长按延时/// </summary>[Parameter]public int OnTouchTime { get; set; } = 500;/// <summary>/// ContextMenu 菜单项点击时触发/// </summary>/// <returns></returns>Task onContextMenu(MouseEventArgs args){if (OnContextMenu != null){return OnContextMenu.Invoke(args);}else{return Task.CompletedTask;}}/// <summary>/// 点击时触发/// </summary>/// <returns></returns>Task onClick(MouseEventArgs args){if (OnClick != null){return OnClick.Invoke(args);}else if (OnLongPress != null && !IsTouchDevice){return OnLongPress.Invoke(args);}else{return Task.CompletedTask;}}/// <summary>/// 是否触摸设备/// </summary>private bool IsTouchDevice { get; set; }/// <summary>/// 是否触摸/// </summary>private bool TouchStart { get; set; }/// <summary>/// 触摸定时器工作指示/// </summary>private bool IsBusy { get; set; }protected override async Task OnAfterRenderAsync(bool firstRender){if (firstRender){IsTouchDevice = await JS!.InvokeAsync<bool>("eval", $"'ontouchstart' in document.documentElement");}}private async Task OnTouchStart(TouchEventArgs e){if (!IsBusy){IsBusy = true;TouchStart = true;// 延时保持 TouchStart 状态await Task.Delay(OnTouchTime);if (TouchStart){var args = new MouseEventArgs(){ClientX = e.Touches[0].ClientX,ClientY = e.Touches[0].ClientY,ScreenX = e.Touches[0].ScreenX,ScreenY = e.Touches[0].ScreenY,Type = "LongPress"};// 弹出关联菜单if (OnContextMenu != null)await OnContextMenu(args);if (OnLongPress != null)await OnLongPress(args);//延时防止重复激活菜单功能await Task.Delay(OnTouchTime);}IsBusy = false;}}private void OnTouchEnd(){TouchStart = false;}}

####3. 回到首页 Home.razor 添加组件测试

@page "/"<PageTitle>Home</PageTitle><LongPressButton OnLongPress="TaskOnLongPress" > <div style="width:200px;height:100px;background-color:gold;"><p>LongPressButton</p></div> 
</LongPressButton><p>@message</p>@code {string message = "No long press";private Task TaskOnLongPress(MouseEventArgs e){message = e.Type;StateHasChanged();return Task.CompletedTask;}
}

####4. 测试

运行程序

普通浏览器模式, 不支持触摸,会自动会落到点击事件, 点击显示为 Click

F12打开开发者工具, 点击模拟手机/平板, 需要F5刷新页面重新读取是否为触摸设备, 点击无反应, 长按显示为

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

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

相关文章

OpenHarmony轻量级驱动开发

OpenHarmony轻量级驱动开发 思维导图: https://download.csdn.net/download/lanlingxueyu/88817155 GPlO(General-purpose input/output)即通用型输入输出 描述 GPlO(General-purpose input/output)即通用型输入输出。通俗地说,GPlO口就是一些引脚可以通过它们输出高低…

【C语言进阶篇】原码、反码、补码

文章目录 一、原反补的简介 1.1 原码 1.2 反码 1.3 补码 1.4 相互转换 二、为什么需要引入三种不同的二进制表示形式 三、总结 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 一、原反补的简介 计算机中的有符号数…

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信&#xff0c;也可以在以太网通信&#xff0c;有A-1E和Qna-3E两种模式&#xff0c;这两种都是三菱PLC通信协议中比较常用的两种&#xff0c;一般我们使用比较多的是以太网通信&#xff0c;对于FX5U系列/Q系列/Qna系列/L系列的PLC&#xff0c;…

代码随想录刷题第30天

明天就是大年三十了&#xff0c;首先祝各位朋友新年快乐&#xff0c;新春愉快&#xff01;巧合的是&#xff0c;今天正好是回溯章节的收尾&#xff0c;这也是辞旧迎新的好兆头。 第一题是重新安排行程https://leetcode.cn/problems/reconstruct-itinerary/description/&#x…

生产者-消费者模式什么?使用场景深度解析!

前言 大家好&#xff0c;我是chowley&#xff0c;祝大家三十快乐&#xff0c;今天总结一下我之前在项目中使用过的生产者-消费者模式。 生产者-消费者模式&#xff08;Producer-Consumer Pattern&#xff09;是一种经典的并发编程模式&#xff0c;用于解决生产者和消费者之间…

Kubernetes与Docker的深入对比:解析容器编排与容器引擎的区别与联系

Kubernetes与Docker的深入对比&#xff1a;解析容器编排与容器引擎的区别与联系 引言 容器技术的崛起为软件开发和部署带来了革命性的变化。在这个领域&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;和Docker是两个备受瞩目的技术&#xff0c;但它们之间有着明显的区…

深度学习入门笔记(八)可以不断思考的模型:RNN与LSTM

8.1 循环神经网络RNN 之前学到的 CNN 和全连接&#xff0c;模型的输入数据之间是没有关联的&#xff0c;比如图像分类&#xff0c;每次输入的图片与图片之间就没有任何关系&#xff0c;上一张图片的内容不会影响到下一张图片的结果。但在自然语言处理领域&#xff0c;这就成了…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

机器学习之T与F分布

T分布 T分布:数学期望为mu=0,方差: σ 2 = n n − 2 ( n > 2 ) \sigma^2=\frac{n}{n-2} \quad (n>2) σ2=n−2n​(n>2)。相同自由度情况下,|t|越大,概率P越小; 设X~N(0,1),Y~χ2(n),并且X和Y独立,则称随机变量 t = X Y n t=\frac{X}{\sqrt{\frac{Y…

Redis Centos7 安装到启动

文章目录 安装Redis启动redis查看redis状况连接redis服务端 安装Redis 1.下载scl源 yum install centos-release-scl-rh2.下载redis yum install rh-redis5-redis 3. 创建软连接 1.cd /usr/bin 2. In -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server 3. …

【RT-DETR进阶实战】利用RT-DETR进行过线统计(可用于人 、车过线统计)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用RT-DETR现有的一些功能进行一些实战, 让我们不仅会改进RT-DETR,也能够利用RT-DETR去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是p…

机器学习系列——(十九)层次聚类

引言 在机器学习和数据挖掘领域&#xff0c;聚类算法是一种重要的无监督学习方法&#xff0c;它试图将数据集中的样本分组&#xff0c;使得同一组内的样本相似度高&#xff0c;不同组间的样本相似度低。层次聚类&#xff08;Hierarchical Clustering&#xff09;是聚类算法中的…

幻兽帕鲁服务器创建私服教程(新版教程更简单)

幻兽帕鲁官方服务器不稳定&#xff1f;自己搭建幻兽帕鲁服务器&#xff0c;低延迟、稳定不卡&#xff0c;目前阿里云和腾讯云均推出幻兽帕鲁专用服务器&#xff0c;腾讯云直接提供幻兽帕鲁镜像系统&#xff0c;阿里云通过计算巢服务&#xff0c;均可以一键部署&#xff0c;鼠标…

项目02《游戏-07-开发》Unity3D

基于 项目02《游戏-06-开发》Unity3D &#xff0c; 接下来做UI框架的逻辑系统&#xff0c;管理器和UI背包&#xff0c; 首先闯将UI框架的两个重要脚本 BasePanel.cs 和 UIManager.cs &#xff0c; 双击BasePanel.cs脚本修改代码&#xff1a; using UnityEngine; pu…

【java苍穹外卖项目实战一】苍穹外卖项目介绍

文章目录 1、项目介绍1、项目概述2、 产品原型3、技术选型 1、项目介绍 在开发苍穹外卖这个项目之前&#xff0c;我们需要全方位的来介绍一下当前我们学习的这个项目。接下来&#xff0c;我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。 1、项目概述 …

绝缘栅极晶体管IGBT

IGBT&#xff08;绝缘栅极晶体管&#xff09;: 常用于百V百A级使用&#xff0c;外观上看相比于MOS最大的区别是比较大&#xff0c;mos主要用于中小功率器件中。 本质是一个电子开关&#xff0c;相比于MOS和三极管来说其最大的特点是耐压很高&#xff0c;可达6000V以上&#xf…

第十四章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性

文章目录 第十四章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性AllocateStatement()Connect()ConnectionHandle propertyDisconnect()DLLHandle 属性DLLName 属性DSN 属性 第十四章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性 AllocateSta…

【LeetCode每日一题】525连续数组 303区域和检索(前缀和的基本概念和3个简单案例)

前缀和 // 构造prefix let prefix [0] arr.forEach(num > {prefix.push(prefix.at(-1) num); })如果想要计算某个区间 i 到 j 这个子数组的和时&#xff0c;可以根据 prefix[j1] - prefix[i] 获得。 例题1&#xff1a;303.区域和检索 - 数组不可变 给定一个整数数组 num…

【开源】SpringBoot框架开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

npm---设置淘宝镜像时报“certificate has expired“的错误

今天使用vue create my-app 创建项目时&#xff0c;竟然报错&#xff1a; Error: Command failed: npm info vue-cli-version-marker --json --registryhttps://registry.npm.taobao.org npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request t…