diff --git a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs index a682a25915..4b0ada1f27 100644 --- a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs +++ b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs @@ -22,6 +22,7 @@ namespace Avalonia.Web.Blazor private DpiWatcherInterop _dpiWatcher = null!; private SKHtmlCanvasInterop.GLInfo? _jsGlInfo = null!; private InputHelperInterop _inputHelper = null!; + private InputHelperInterop _canvasHelper = null!; private ElementReference _htmlCanvas; private ElementReference _inputElement; private double _dpi; @@ -254,10 +255,11 @@ namespace Avalonia.Web.Blazor Threading.Dispatcher.UIThread.Post(async () => { _inputHelper = await InputHelperInterop.ImportAsync(Js, _inputElement); + _canvasHelper = await InputHelperInterop.ImportAsync(Js, _htmlCanvas); _inputHelper.Hide(); - _inputHelper.SetCursor("default"); - _topLevelImpl.SetCssCursor = _inputHelper.SetCursor; + _canvasHelper.SetCursor("default"); + _topLevelImpl.SetCssCursor = _canvasHelper.SetCursor; Console.WriteLine("starting html canvas setup"); _interop = await SKHtmlCanvasInterop.ImportAsync(Js, _htmlCanvas, OnRenderFrame); diff --git a/src/Web/Avalonia.Web.Blazor/Cursor.cs b/src/Web/Avalonia.Web.Blazor/Cursor.cs index cd9010dfc2..d921b2fa6c 100644 --- a/src/Web/Avalonia.Web.Blazor/Cursor.cs +++ b/src/Web/Avalonia.Web.Blazor/Cursor.cs @@ -5,6 +5,7 @@ namespace Avalonia.Web.Blazor { public class CssCursor : ICursorImpl { + public const string Default = "default"; public string? Value { get; set; } public CssCursor(StandardCursorType type) @@ -17,7 +18,7 @@ namespace Avalonia.Web.Blazor /// public CssCursor(string base64, string format, PixelPoint hotspot, StandardCursorType fallback) { - Value = $"url(data:image/{format},{base64}) {hotspot.X} {hotspot.Y}, {ToKeyword(fallback)}"; + Value = $"url(\"data:image/{format};base64,{base64}\") {hotspot.X} {hotspot.Y}, {ToKeyword(fallback)}"; } /// @@ -65,7 +66,7 @@ namespace Avalonia.Web.Blazor StandardCursorType.BottomLeftCorner => "sw-resize", StandardCursorType.BottomRightCorner => "se-resize", - _ => "default", + _ => Default, }; public void Dispose() {} diff --git a/src/Web/Avalonia.Web.Blazor/RazorViewTopLevelImpl.cs b/src/Web/Avalonia.Web.Blazor/RazorViewTopLevelImpl.cs index 1b1fca7e26..ac5f5044d8 100644 --- a/src/Web/Avalonia.Web.Blazor/RazorViewTopLevelImpl.cs +++ b/src/Web/Avalonia.Web.Blazor/RazorViewTopLevelImpl.cs @@ -21,6 +21,7 @@ namespace Avalonia.Web.Blazor private readonly Stopwatch _sw = Stopwatch.StartNew(); private readonly ITextInputMethodImpl _textInputMethod; private readonly TouchDevice _touchDevice; + private string _currentCursor = CssCursor.Default; public RazorViewTopLevelImpl(ITextInputMethodImpl textInputMethod) { @@ -127,11 +128,15 @@ namespace Avalonia.Web.Blazor public void SetCursor(ICursorImpl cursor) { var cur = cursor as CssCursor; - if (cur == null || cur.Value == null) + var val = CssCursor.Default; + if (cur != null && cur.Value != null) { - throw new NotSupportedException(); + val = cur.Value; + } + if (_currentCursor != val) + { + SetCssCursor?.Invoke(val); } - SetCssCursor?.Invoke(cur.Value); } public IPopupImpl? CreatePopup()