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

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; } bool IsEdit { get; set; } = false; private Task ValueChangedOnConfirm()
{
IsEdit = false;
return Task.CompletedTask;
} /// <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刷新页面重新读取是否为触摸设备, 点击无反应, 长按显示为

Blazor入门100天 : 自做一个支持长按事件的按钮组件的更多相关文章

  1. uwp - 做一个相对炫酷的动画按钮/按钮动画

    原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...

  2. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  3. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  4. VUE2.0+VUE-Router做一个图片上传预览的组件

    之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...

  5. 做一个开源的小程序登录模块组件(token)

    先了解下SSO 对于单点登陆浅显一点的说就是两种,一种web端的基于Cookie.另一种是跨端的基于Token,一般想要做的都优先做Token吧,个人建议,因为后期扩展也方便哦. 小程序也是呢,做成t ...

  6. Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)

    Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲键盘,手 ...

  7. Blazor入门100天 : 身份验证和授权 (2) - 角色/组件/特性/过程逻辑

    目录 建立默认带身份验证 Blazor 程序 `角色/组件/特性/过程逻辑 DB 改 Sqlite 将自定义字段添加到用户表 脚手架拉取IDS文件,本地化资源 freesql 生成实体类,freesq ...

  8. Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据

    目录 建立默认带身份验证 Blazor 程序 角色/组件/特性/过程逻辑 DB 改 Sqlite 将自定义字段添加到用户表 脚手架拉取IDS文件,本地化资源 freesql 生成实体类,freesql ...

  9. 用border做一个移动端常见的返回按钮

    第一步 .hs1{ float: left; .mt(.25rem); .ml(.12rem); width: .3rem; height: .3rem; border-top: 2px solid ...

  10. ASP.NET 工作流:支持长时间运行操作的 Web 应用程序

    ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy   代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...

随机推荐

  1. 2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =

    2023-09-03:用go语言编写.给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] ...

  2. SpringBoot获取树状结构数据-SQL处理

    前言 在开发中,层级数据(树状结构)的获取往往可能是我们一大难点,我现在将自己获取的树状结构数据方法总结如下,希望能给有需要的小伙伴有所帮助! 一.测试数据准备 /* Navicat Premium ...

  3. 【Python爬虫】python打印本地代理

    在进行网络爬虫时,使用代理是非常重要的.因为爬虫经常会被网站封 IP,而代理可以隐藏你的真实 IP 地址,让你可以更不受限制地爬取数据.本文将介绍如何在 Python 中打印代理,包括代理 IP 的使 ...

  4. dp_ppi转光纤模块连接200PLC组态王通信案例

    DP_PPI转光纤模块连接200PLC组态王光纤通信在冷却塔控制系统案例 现场背景介绍: 西门子200 CPU226PLC通过兴达易控dp转光纤模块在200PLC系统中ppi转光纤实现PCL与组态王2 ...

  5. Mac上虚拟环境的安装与使用

    Mac上虚拟环境的安装与使用 介绍 virtualenv是python虚拟环境,能够和系统环境相隔离,保持环境的纯净. virtualenvwrapper可以方便管理虚拟环境 安装 pip insta ...

  6. 从零开始FastDFS整合Nginx(转)

    转自 https://www.cnblogs.com/chiangchou/p/fastdfs.html#_labelTop Linux环境:Centos7.0   安装过程 原博客有几处纰漏,下文已 ...

  7. Go语言系列——Go语言介绍

    文章目录 01-Go语言介绍 一 Go语言介绍 二 Go语言特性 三 Go语言发展(版本/特性) 四 Go语言应用 谁在用 Google Facebook 腾讯 百度 京东 小米 360 应用领域 五 ...

  8. Python基础——变量、常量、数字类型、四 列表list、五 字典dict、六 布尔bool、垃圾回收机制、用户交互、运算符、流程控制

    文章目录 变量 一 引入 一.什么是变量? 二.为什么要有变量? 三.怎么使用变量(先定义.后使用) 3.1.变量的定义与使用 3.2.变量名的命名规范 3.3.变量名的命名风格 3.4.变量值的三大 ...

  9. 基于 ACK Serverless 解锁你家萌宠的 AI 形象

    基于 ACK Serverless 解锁你家萌宠的 AI 形象详情      1. 计费说明 必看!!必看!!必看!! 本实验为付费体验,需要消耗账号费用.体验后若不再需要使用,请及时释放资源,避免持 ...

  10. 我在前端写Java SpringBoot项目

    前言 玩归玩,闹归闹,别拿 C端 开玩笑! 这里不推荐大家把Node服务作为C端服务,毕竟它是单线程多任务 机制. 这一特性是 Javascript 语言设计之初,就决定了它的使命 - Java &g ...