+ onkeyup="@OnKeyUp"
+ onpointerdown="@OnPointerDown"
+ onpointerup="@OnPointerUp"
+ onpointermove="@OnPointerMove">
-
-
-
+
+
+
+
+
+
+
diff --git a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs
index 1ccf53943a..7531dbf681 100644
--- a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs
+++ b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs
@@ -1,5 +1,6 @@
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Embedding;
+using Avalonia.Controls.Platform;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Input.TextInput;
@@ -18,14 +19,16 @@ namespace Avalonia.Web.Blazor
private EmbeddableControlRoot _topLevel;
// Interop
- private SKHtmlCanvasInterop _interop = null!;
- private SizeWatcherInterop _sizeWatcher = null!;
- private DpiWatcherInterop _dpiWatcher = null!;
- private SKHtmlCanvasInterop.GLInfo? _jsGlInfo = null!;
- private InputHelperInterop _inputHelper = null!;
- private InputHelperInterop _canvasHelper = null!;
+ private SKHtmlCanvasInterop? _interop = null;
+ private SizeWatcherInterop? _sizeWatcher = null;
+ private DpiWatcherInterop? _dpiWatcher = null;
+ private SKHtmlCanvasInterop.GLInfo? _jsGlInfo = null;
+ private InputHelperInterop? _inputHelper = null;
+ private InputHelperInterop? _canvasHelper = null;
+ private NativeControlHostInterop? _nativeControlHost = null;
private ElementReference _htmlCanvas;
private ElementReference _inputElement;
+ private ElementReference _nativeControlsContainer;
private double _dpi = 1;
private SKSize _canvasSize = new (100, 100);
@@ -49,24 +52,11 @@ namespace Avalonia.Web.Blazor
}
}
- private void OnTouchStart(TouchEventArgs e)
+ internal INativeControlHostImpl GetNativeControlHostImpl()
{
- foreach (var touch in e.ChangedTouches)
- {
- _topLevelImpl.RawTouchEvent(RawPointerEventType.TouchBegin, new Point(touch.ClientX, touch.ClientY),
- GetModifiers(e), touch.Identifier);
- }
- }
-
- private void OnTouchEnd(TouchEventArgs e)
- {
- foreach (var touch in e.ChangedTouches)
- {
- _topLevelImpl.RawTouchEvent(RawPointerEventType.TouchEnd, new Point(touch.ClientX, touch.ClientY),
- GetModifiers(e), touch.Identifier);
- }
+ return _nativeControlHost ?? throw new InvalidOperationException("Blazor View wasn't initialized yet");
}
-
+
private void OnTouchCancel(TouchEventArgs e)
{
foreach (var touch in e.ChangedTouches)
@@ -85,53 +75,72 @@ namespace Avalonia.Web.Blazor
}
}
- private void OnMouseMove(MouseEventArgs e)
+ private void OnPointerMove(Microsoft.AspNetCore.Components.Web.PointerEventArgs e)
{
- _topLevelImpl.RawMouseEvent(RawPointerEventType.Move, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ if (e.PointerType != "touch")
+ {
+ _topLevelImpl.RawMouseEvent(RawPointerEventType.Move, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ }
}
- private void OnMouseUp(MouseEventArgs e)
+ private void OnPointerUp(Microsoft.AspNetCore.Components.Web.PointerEventArgs e)
{
- RawPointerEventType type = default;
-
- switch (e.Button)
+ if (e.PointerType == "touch")
+ {
+ _topLevelImpl.RawTouchEvent(RawPointerEventType.TouchEnd, new Point(e.ClientX, e.ClientY),
+ GetModifiers(e), e.PointerId);
+ }
+ else
{
- case 0:
- type = RawPointerEventType.LeftButtonUp;
- break;
+ RawPointerEventType type = default;
- case 1:
- type = RawPointerEventType.MiddleButtonUp;
- break;
+ switch (e.Button)
+ {
+ case 0:
+ type = RawPointerEventType.LeftButtonUp;
+ break;
- case 2:
- type = RawPointerEventType.RightButtonUp;
- break;
- }
+ case 1:
+ type = RawPointerEventType.MiddleButtonUp;
+ break;
+
+ case 2:
+ type = RawPointerEventType.RightButtonUp;
+ break;
+ }
- _topLevelImpl.RawMouseEvent(type, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ _topLevelImpl.RawMouseEvent(type, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ }
}
- private void OnMouseDown(MouseEventArgs e)
+ private void OnPointerDown(Microsoft.AspNetCore.Components.Web.PointerEventArgs e)
{
- RawPointerEventType type = default;
-
- switch (e.Button)
+ if (e.PointerType == "touch")
+ {
+ _topLevelImpl.RawTouchEvent(RawPointerEventType.TouchBegin, new Point(e.ClientX, e.ClientY),
+ GetModifiers(e), e.PointerId);
+ }
+ else
{
- case 0:
- type = RawPointerEventType.LeftButtonDown;
- break;
+ RawPointerEventType type = default;
- case 1:
- type = RawPointerEventType.MiddleButtonDown;
- break;
+ switch (e.Button)
+ {
+ case 0:
+ type = RawPointerEventType.LeftButtonDown;
+ break;
- case 2:
- type = RawPointerEventType.RightButtonDown;
- break;
- }
+ case 1:
+ type = RawPointerEventType.MiddleButtonDown;
+ break;
- _topLevelImpl.RawMouseEvent(type, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ case 2:
+ type = RawPointerEventType.RightButtonDown;
+ break;
+ }
+
+ _topLevelImpl.RawMouseEvent(type, new Point(e.ClientX, e.ClientY), GetModifiers(e));
+ }
}
private void OnWheel(WheelEventArgs e)
@@ -181,7 +190,7 @@ namespace Avalonia.Web.Blazor
return modifiers;
}
- private static RawInputModifiers GetModifiers(MouseEventArgs e)
+ private static RawInputModifiers GetModifiers(Microsoft.AspNetCore.Components.Web.PointerEventArgs e)
{
var modifiers = RawInputModifiers.None;
@@ -224,12 +233,12 @@ namespace Avalonia.Web.Blazor
private void OnKeyDown(KeyboardEventArgs e)
{
- _topLevelImpl.RawKeyboardEvent(RawKeyEventType.KeyDown, e.Code, GetModifiers(e));
+ _topLevelImpl.RawKeyboardEvent(RawKeyEventType.KeyDown, e.Code, e.Key, GetModifiers(e));
}
private void OnKeyUp(KeyboardEventArgs e)
{
- _topLevelImpl.RawKeyboardEvent(RawKeyEventType.KeyUp, e.Code, GetModifiers(e));
+ _topLevelImpl.RawKeyboardEvent(RawKeyEventType.KeyUp, e.Code, e.Key, GetModifiers(e));
}
private void OnInput(ChangeEventArgs e)
@@ -243,7 +252,7 @@ namespace Avalonia.Web.Blazor
}
}
- _inputHelper.Clear();
+ _inputHelper?.Clear();
}
[Parameter(CaptureUnmatchedValues = true)]
@@ -253,6 +262,8 @@ namespace Avalonia.Web.Blazor
{
if (firstRender)
{
+ AvaloniaLocator.CurrentMutable.Bind