翼度科技»论坛 编程开发 .net 查看内容

Blazor 调用 Clipboard API 读写剪贴板数据

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
目录

简介

Clipboard API 是一种允许网页读取剪贴板数据或向其中写入数据的API,主要有两个方法:

  • navigator.clipboard.writeText() :用于将文本写入剪贴板。
  • navigator.clipboard.readText():用于从剪贴板读取文本。
网上相关的文章基本上都是直接使用 Blazor 的JS互操作特性来实现功能 ,本文除了JS互操作还介绍了使用 ClipLazor 库实现功能的方法,使用第三方库代码会更简洁一点。
使用JS互操作

JS调用 Clipboard API的代码如下,代码可以直接放到 razor 页面中:
  1. [/code]在 Razor 组件中注入 JSRuntime,并调用该JS:
  2. [code]@* 注入 IJSRuntime 实例,用于和 JavaScript 进行交互 *@
  3. @inject IJSRuntime JsRuntime
  4. // 该方法用于将文本异步复制到剪贴板
  5. private async Task CopyTextToClipboard(string txt)
  6. {
  7.     await JsRuntime.InvokeVoidAsync("clipboardCopy.copyText", txt);
  8. }
复制代码
使用ClipLazor库

ClipLazor 是一个库,它为 Blazor 应用程序中的 Clipboard API 提供互操作,本质上是对JS互操作进行了封装。
创建项目

新建一个 Blazor Web App 项目,开发框架选择 .NET8,在 Client 项目中通过 NuGet 添加 ClipLazor 依赖项。
Program.cs 文件中,使用 AddClipboard 方法将服务注册到 IoC 容器,服务端和客户端项目都需要添加
  1. using ClipLazor.Extention;
  2. //...
  3. builder.Services.AddClipboard();
  4. //...
复制代码
在服务端项目的 App.razor 文件中添加此脚本标记:
  1. [/code][size=5]使用方法[/size]
  2. Blazor Web App项目模板把解决方案分成了服务端、客户端两个项目,有交互操作的页面都需要放在客户端项目中,将 Clipboard 注入到 razor 文件中:
  3. [code]@using ClipLazor.Components;
  4. @using ClipLazor.Enums;
  5. @inject IClipLazor Clipboard
复制代码
检查浏览器是否支持 Clipboard API:
  1. bool isSupported = default;
  2. bool isWritePermitted = default;
  3. bool isReadPermitted = default;
  4. protected override async Task OnAfterRenderAsync(bool firstRender)
  5. {
  6.     // 静态渲染期间无法进行js互操作,所以必须在这个周期点执行
  7.     if (firstRender)
  8.     {
  9.         isSupported = await Clipboard.IsClipboardSupported();
  10.         isWritePermitted = await Clipboard.IsPermitted(PermissionCommand.Write);
  11.         isReadPermitted = await Clipboard.IsPermitted(PermissionCommand.Read);
  12.     }
  13. }
复制代码
简单的复制粘贴文本的操作方法:
  1. string msg = string.Empty;
  2. string txt = string.Empty;
  3. string pastedTxt = string.Empty;
  4. async void CopyTxt(string txt)
  5. {
  6.     if (txt.Length > 0 && isSupported)
  7.     {
  8.         if (isWritePermitted)
  9.         {
  10.             var isCopied = await Clipboard.WriteTextAsync(txt.AsMemory());
  11.             if (isCopied)
  12.             {
  13.                 msg = "Text Copied";
  14.             }
  15.             else
  16.             {
  17.                 msg = "Couldn't copy the text!.";
  18.             }
  19.         }
  20.         StateHasChanged();
  21.     }
  22. }
  23. async void PasteTxt()
  24. {
  25.     if (isSupported && isWritePermitted)
  26.     {
  27.         var pastedText = await Clipboard.ReadTextAsync();
  28.         if (pastedText is not null)
  29.         {
  30.             msg = "Text Pasted";
  31.             pastedTxt = pastedText;
  32.         }
  33.         else
  34.         {
  35.             msg = "Couldn't paste the text!.";
  36.         }
  37.     }
  38.     StateHasChanged();
  39. }
复制代码
实际使用时也支持复制粘贴图像或二进制文件,具体代码可以参考 ClipLazor 库的完整示例
简单测试

以客户端项目的 Counter.razor 为例:
  1. @page "/counter"
  2. @rendermode InteractiveAuto
  3. //代码:将 Clipboard 注入  到 razor 文件中
  4. <PageTitle>Counter</PageTitle>
  5. <h1>Counter</h1>
  6. <p role="status">Current count: @currentCount</p>
  7. <button  @onclick="IncrementCount">Click me</button>
  8. <p role="status">Txt: @txt</p>
  9. <p role="status">Msg: @msg</p>
  10. <p role="status">PastedTxt: @pastedTxt</p>
  11. @code {
  12.     //代码:检查浏览器是否支持 Clipboard API
  13.     private int currentCount = 0;
  14.     private async void IncrementCount()
  15.     {
  16.         currentCount++;
  17.         txt = currentCount.ToString();
  18.         CopyTxt(txt);
  19.         PasteTxt();
  20.     }
  21.     //代码:简单的复制粘贴文本的操作方法
  22. }
复制代码
测试结果:

参考链接


来源:https://www.cnblogs.com/timefiles/p/18464605
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具