Browse Source

added ClipboardImpl with hooks to navigator.clipboard.readtext and naviagot.clipboard.writeText so Avalonia web can TextBox copy-paste works

pull/8242/head
Oxc3 4 years ago
parent
commit
9cc69eec22
  1. 5
      src/Web/Avalonia.Web.Blazor/AvaloniaView.razor
  2. 34
      src/Web/Avalonia.Web.Blazor/ClipboardImpl.cs
  3. 15
      src/Web/Avalonia.Web.Blazor/WinStubs.cs
  4. 2
      src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs

5
src/Web/Avalonia.Web.Blazor/AvaloniaView.razor

@ -12,7 +12,10 @@
<div id="nativeControlsContainer" @ref="_nativeControlsContainer" />
<input id="inputElement" @ref="_inputElement" type="text" oninput="@OnInput"/>
<input id="inputElement" @ref="_inputElement" type="text" oninput="@OnInput"
onpaste="return false;"
oncopy="return false;"
oncut="return false;"/>
</div>
<style>

34
src/Web/Avalonia.Web.Blazor/ClipboardImpl.cs

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Microsoft.JSInterop;
namespace Avalonia.Web.Blazor
{
internal class ClipboardImpl : IClipboard
{
public async Task<string> GetTextAsync()
{
return await AvaloniaLocator.Current.GetRequiredService<IJSInProcessRuntime>().
InvokeAsync<string>("navigator.clipboard.readText");
}
public async Task SetTextAsync(string text)
{
await AvaloniaLocator.Current.GetRequiredService<IJSInProcessRuntime>().
InvokeAsync<string>("navigator.clipboard.writeText",text);
}
public Task ClearAsync() => Task.CompletedTask;
public Task SetDataObjectAsync(IDataObject data) => Task.CompletedTask;
public Task<string[]> GetFormatsAsync() => Task.FromResult(Array.Empty<string>());
public Task<object> GetDataAsync(string format) => Task.FromResult<object>(new());
}
}

15
src/Web/Avalonia.Web.Blazor/WinStubs.cs

@ -8,21 +8,6 @@ using Avalonia.Platform;
namespace Avalonia.Web.Blazor
{
internal class ClipboardStub : IClipboard
{
public Task<string> GetTextAsync() => Task.FromResult("");
public Task SetTextAsync(string text) => Task.CompletedTask;
public Task ClearAsync() => Task.CompletedTask;
public Task SetDataObjectAsync(IDataObject data) => Task.CompletedTask;
public Task<string[]> GetFormatsAsync() => Task.FromResult(Array.Empty<string>());
public Task<object> GetDataAsync(string format) => Task.FromResult<object>(new ());
}
internal class IconLoaderStub : IPlatformIconLoader
{
private class IconStub : IWindowIconImpl

2
src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs

@ -34,7 +34,7 @@ namespace Avalonia.Web.Blazor
var instance = new BlazorWindowingPlatform();
s_keyboard = new KeyboardDevice();
AvaloniaLocator.CurrentMutable
.Bind<IClipboard>().ToSingleton<ClipboardStub>()
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<ICursorFactory>().ToSingleton<CssCursorFactory>()
.Bind<IKeyboardDevice>().ToConstant(s_keyboard)
.Bind<IPlatformSettings>().ToConstant(instance)

Loading…
Cancel
Save