【发布时间】:2012-07-20 06:03:17
【问题描述】:
我有一个Form(winform),它包含Elementhost。在运行时,我将我的 WPF 用户控件托管到此 elementhost。我已将AutoSize = True 用于元素主机。
Elementhost 根据 WPF 用户控件大小调整自身大小。但是如何根据 ElementHost 的大小调整表单的大小。
谢谢,
【问题讨论】:
标签: wpf winforms elementhost
我有一个Form(winform),它包含Elementhost。在运行时,我将我的 WPF 用户控件托管到此 elementhost。我已将AutoSize = True 用于元素主机。
Elementhost 根据 WPF 用户控件大小调整自身大小。但是如何根据 ElementHost 的大小调整表单的大小。
谢谢,
【问题讨论】:
标签: wpf winforms elementhost
答案如下:
将 ElementHost.Child 设置为 WPF 用户控件后。我将遵循功能:
public System.Windows.Size GetElementPixelSize(UIElement element)
{
Matrix transformToDevice;
var source = PresentationSource.FromVisual(element);
if (source != null)
transformToDevice = source.CompositionTarget.TransformToDevice;
else
using (var Hwndsource = new HwndSource(new HwndSourceParameters()))
transformToDevice = Hwndsource.CompositionTarget.TransformToDevice;
if (element.DesiredSize == new System.Windows.Size())
element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
return (System.Windows.Size)transformToDevice.Transform((Vector)element.DesiredSize);
}
原方法贴于:How do I convert a WPF size to physical pixels?
现在我从新大小设置客户端大小。
【讨论】:
抱歉,难道不能订阅size changes 并更新主机表单吗?
【讨论】:
我有一个解决方案,但不确定输出。它在 WPF 桌面应用程序中工作。 您要做的就是将高度和宽度设置为 NAN(不是数字)
this.Width = double.NaN;
this.Height = double.NaN;
【讨论】:
而不是设置自动大小设置:
this.elementHost1.Dock = System.Windows.Forms.DockStyle.Fill;
【讨论】:
这是一个老问题,但我经常来,所以它仍然相关,所以这是我的解决方案:
我做的是:
一个。当我希望 WPF 视图匹配(停靠)窗口大小时:
ElementHost eh = new ElementHost();
eh.Dock = System.Windows.Forms.DockStyle.Dock;
eh.AutoSize = true;
eh.Child = wpfView;
eh.CreateControl();
this.Controls.Add(eh);
this.AutoSize = false;
注意:如果表格太小,您可以设置 eh 最小尺寸以具有滚动条。
b:当我希望宿主窗体匹配 WPF 视图时:
ElementHost eh = new ElementHost();
eh.Dock = System.Windows.Forms.DockStyle.None;
eh.AutoSize = true;
eh.Child = wpfView;
eh.CreateControl();
this.Controls.Add(eh);
this.AutoSize = true;
this.AutoSizeMode=AutoSizeMode.GrowAndShrink;
【讨论】: