diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
index 6b2356a96a..3d29fa6b6e 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
@@ -5,6 +5,13 @@ using System;
using System.Collections.Generic;
using System.Windows;
using System.Linq;
+using System.IO;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Xps.Serialization;
namespace ICSharpCode.WpfDesign.Designer
{
@@ -96,15 +103,56 @@ namespace ICSharpCode.WpfDesign.Designer
}
}
+ internal static void CreateVisualTree(this UIElement element)
+ {
+ try {
+ var fixedDoc = new FixedDocument();
+ var pageContent = new PageContent();
+ var fixedPage = new FixedPage();
+ fixedPage.Children.Add(element);
+ (pageContent as IAddChild).AddChild(fixedPage);
+ fixedDoc.Pages.Add(pageContent);
+
+ var f = new XpsSerializerFactory();
+ var w = f.CreateSerializerWriter(new MemoryStream());
+ w.Write(fixedDoc);
+
+ fixedPage.Children.Remove(element);
+ }
+ catch (Exception)
+ { }
+ }
+
internal static Size GetDefaultSize(DesignItem createdItem)
{
- var s = Metadata.GetDefaultSize(createdItem.ComponentType);
- if (double.IsNaN(s.Width)) {
- s.Width = GetWidth(createdItem.View);
- }
- if (double.IsNaN(s.Height)) {
- s.Height = GetHeight(createdItem.View);
- }
+ CreateVisualTree(createdItem.View);
+
+ var s = Metadata.GetDefaultSize(createdItem.ComponentType, false);
+
+ if (double.IsNaN(s.Width) && createdItem.View.DesiredSize.Width > 0)
+ {
+ s.Width = createdItem.View.DesiredSize.Width;
+ }
+ if (double.IsNaN(s.Height) && createdItem.View.DesiredSize.Height > 0)
+ {
+ s.Height = createdItem.View.DesiredSize.Width;
+ }
+
+ var newS = Metadata.GetDefaultSize(createdItem.ComponentType, true);
+
+ if (!(s.Width > 0))
+ s.Width = newS.Width;
+
+ if (!(s.Height > 0))
+ s.Height = newS.Height;
+
+ if (double.IsNaN(s.Width)) {
+ s.Width = GetWidth(createdItem.View);
+ }
+ if (double.IsNaN(s.Height)) {
+ s.Height = GetHeight(createdItem.View);
+ }
+
return s;
}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
index 1cca268adb..d505a941bb 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
@@ -55,6 +55,9 @@
False
3.0
+
+ 3.0
+
3.5
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs
index 17caabc7df..b81f6facc3 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs
@@ -298,7 +298,7 @@ namespace ICSharpCode.WpfDesign
/// Gets the default size for new controls of the specified type,
/// or new Size(double.NaN, double.NaN) if no default size was registered.
///
- public static Size GetDefaultSize(Type t)
+ public static Size GetDefaultSize(Type t, bool checkBasetype = true)
{
Size s;
lock (defaultSizes) {
@@ -306,7 +306,7 @@ namespace ICSharpCode.WpfDesign
if (defaultSizes.TryGetValue(t, out s)) {
return s;
}
- t = t.BaseType;
+ t = checkBasetype ? t.BaseType : null;
}
}
return new Size(double.NaN, double.NaN);