From 671a13d30339cae86f4e7dfdbcb380eda4dd6248 Mon Sep 17 00:00:00 2001
From: Daniel Lerch <36048059+daniel-lerch@users.noreply.github.com>
Date: Sat, 13 Jul 2024 01:04:31 +0200
Subject: [PATCH] Disable WinFormsAvaloniaControlHost in design mode (#16296)
---
.../WinForms/WinFormsAvaloniaControlHost.cs | 42 ++++++++++++++-----
1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs b/src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs
index 1f8c30030c9..44e9c85d2e4 100644
--- a/src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs
+++ b/src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs
@@ -1,5 +1,7 @@
using System;
using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
using System.Windows.Forms;
using Avalonia.Controls.Embedding;
using Avalonia.Win32.Interop;
@@ -49,15 +51,20 @@ public AvControl? Content
///
protected override void OnHandleCreated(EventArgs e)
{
- _root = new();
- _root.Content = _content;
- _root.Prepare();
- _root.StartRendering();
- _root.GotFocus += RootGotFocus;
+ // EmbeddableControlRoot requires Avalonia to be initialized which is not done by the Windows Forms designer.
+ if (!DesignMode)
+ {
+ _root = new();
+ _root.Content = _content;
+ _root.Prepare();
+ _root.StartRendering();
+ _root.GotFocus += RootGotFocus;
+
+ FixPosition();
+
+ UnmanagedMethods.SetParent(WindowHandle, Handle);
+ }
- FixPosition();
-
- UnmanagedMethods.SetParent(WindowHandle, Handle);
base.OnHandleCreated(e);
}
@@ -93,14 +100,14 @@ protected override void OnGotFocus(EventArgs e)
if (handle != default)
UnmanagedMethods.SetFocus(handle);
}
-
+
private void FixPosition()
{
var handle = WindowHandle;
if (handle != default && Width > 0 && Height > 0)
UnmanagedMethods.MoveWindow(handle, 0, 0, Width, Height, true);
}
-
+
///
protected override void OnResize(EventArgs e)
{
@@ -111,6 +118,21 @@ protected override void OnResize(EventArgs e)
///
protected override void OnPaint(PaintEventArgs e)
{
+ if (DesignMode)
+ {
+ const string message = "Avalonia control is disabled in design mode.";
+ using var pen = new Pen(SystemBrushes.ControlDark);
+ var outline = ClientSize - new SizeF(pen.Width, pen.Width);
+ e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
+ e.Graphics.DrawRectangle(pen, 0, 0, outline.Width, outline.Height);
+ e.Graphics.DrawLine(pen, 0, 0, outline.Width, outline.Height);
+ e.Graphics.DrawLine(pen, 0, outline.Height, outline.Width, 0);
+
+ var messageSize = e.Graphics.MeasureString(message, Font, ClientSize);
+ var messageLocation = new PointF(ClientSize.Width / 2 - messageSize.Width / 2, ClientSize.Height / 2 - messageSize.Height / 2);
+ var messageArea = new RectangleF(messageLocation, messageSize);
+ e.Graphics.DrawString(message, Font, SystemBrushes.ControlText, messageArea);
+ }
}
}