diff --git a/src/Avalonia.Controls/Design.cs b/src/Avalonia.Controls/Design.cs
index 1f7dd4d934..890d7077c8 100644
--- a/src/Avalonia.Controls/Design.cs
+++ b/src/Avalonia.Controls/Design.cs
@@ -142,6 +142,40 @@ namespace Avalonia.Controls
s_previewWith[target] = template;
}
+ ///
+ /// Sets a preview control for the specified at design-time.
+ ///
+ /// The target object.
+ /// The preview control.
+ public static void SetPreviewWith(AvaloniaObject target, Control? control)
+ {
+ if (control is null)
+ {
+ s_previewWith[target] = null;
+ return;
+ }
+
+ switch (target)
+ {
+ case ResourceDictionary resourceDictionary:
+ SetPreviewWith(resourceDictionary, control);
+ break;
+ case IDataTemplate dataTemplate:
+ SetPreviewWith(dataTemplate, control);
+ break;
+ case IStyle style:
+ SetPreviewWith(style, control);
+ break;
+ case Visual:
+ // Not a supported scenario without templates; causes stack overflows.
+ s_previewWith[target] = null;
+ break;
+ default:
+ SetPreviewWith(target, new FuncTemplate(() => control));
+ break;
+ }
+ }
+
///
/// Sets a preview template for the specified at design-time.
///
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DesignModeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DesignModeTests.cs
index 42776b236c..cb2b25f0d5 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DesignModeTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DesignModeTests.cs
@@ -33,23 +33,19 @@ public class DesignModeTests : XamlTestBase
}
[Fact]
- public void Design_Mode_PreviewWith_Works_With_Control_Template()
+ public void Design_Mode_PreviewWith_Returns_Original_Control()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var obj = (Control)AvaloniaRuntimeXamlLoader.Load(@"
", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
- var previewBorder = Assert.IsType(preview);
- Assert.IsType(previewBorder.Child);
+ // Should return the original control, not the preview, as this is not supported to avoid stack overflows.
+ Assert.Same(obj, preview);
}
}