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); + } } }