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

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. 什么是IP协议?

    简介: IP(Internet Protocol)协议,又称网际协议,是TCP/IP协议的核心.它负责Internet上网络之间的通信,并规定了将数据报从一个网络传输到另一个网络所应遵循的规则.具体来 ...

  2. RocketMQ 消息重试与死信队列

    RocketMQ 消息重试与死信队列 RocketMQ 前面系列文章如下: RocketMQ系列(一) 基本介绍 RocketMQ 系列(二) 环境搭建 RocketMQ 系列(三) 集成 Sprin ...

  3. 关于oop的一点回忆

    昨天在一个程序员行业群里看到别人发了一条消息, 大意是:要做好封装啦,不要随便用public啦,不要随便改别人代码啦. 说的好像就是我,因为,我这辈子最后悔的一件事情之一就是手贱改动别人代码. 那大概 ...

  4. 开源.NetCore通用工具库Xmtool使用连载 - 扩展动态对象篇

    [Github源码] <上一篇> 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库. 扩展动态对象是整个工具库中最重要的一个设计.在软件开发过程中, ...

  5. Oracle:查询表的统计信息,手动收集统计信息

    在Oracle中,存在执行计划不准的情况,怀疑表的统计信息是否收集,需要以下操作:select table_name,num_rows,blocks,last_analyzed from user_t ...

  6. GO数组解密:从基础到高阶全解

    在本文中,我们深入探讨了Go语言中数组的各个方面.从基础概念.常规操作,到高级技巧和特殊操作,我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南.无论您是初学者还是经验丰富的开发者,这篇文章 ...

  7. How can I access GPT-4?

    How can I access GPT-4?   Written by Joshua J.. Updated over a week ago API Access Most users will n ...

  8. visio 2010 kit tools

    Getting Office License Configuration Information.---------------------------------------Backing Up L ...

  9. 比赛总结:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)

    比赛:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324) A-same 1.常 ...

  10. 新手面对安卓6.0以上的版本时出现一个关于文件权限检测的问题,报错为:“无法解析符号 'checkSelfPermission'”,解决办法

    [[注意]:这只是笔者在遇到这个问题时的解决方法,如果对您毫无帮助,请自寻他法!!!] 面对新手:在简单做一个音乐播放程序时,如果面对安卓6.0以上的版本,就会出现一个关于文件权限检测的问题,报错为: ...