Browse Source

Disable WinFormsAvaloniaControlHost in design mode (#16296)

pull/16305/head
Daniel Lerch 2 years ago
committed by GitHub
parent
commit
671a13d303
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 42
      src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs

42
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 class WinFormsAvaloniaControlHost : WinFormsControl
/// <inheritdoc />
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 @@ public class WinFormsAvaloniaControlHost : WinFormsControl
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);
}
/// <inheritdoc />
protected override void OnResize(EventArgs e)
{
@ -111,6 +118,21 @@ public class WinFormsAvaloniaControlHost : WinFormsControl
/// <inheritdoc />
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);
}
}
}

Loading…
Cancel
Save