【问题标题】:opening WPF user control winform window shrinks parent winform window打开WPF用户控件winform窗口缩小父winform窗口
【发布时间】:2014-10-16 18:03:48
【问题描述】:

我有一个这样的 WPF 用户控件...

namespace WpfApplication1
{
    public partial class MyControl : UserControl
    {
    ......
    }
}

我还有一个包含这个 WPF 用户控件的 win 表单...

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{

    public Form1()
    {

        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ElementHost ctrlHost = new ElementHost();
        ctrlHost.Dock = DockStyle.Fill;
        WpfApplication1.MyControl win = new WpfApplication1.MyControl();
        ctrlHost.Child = win;
        this.Controls.Add(ctrlHost);
    }
}
}

我还有一个带有按钮的家长获胜表单。单击该按钮将打开包含 ElementHost 的 Form1。

namespace WindowsFormsApplication4
{
    public partial class Parent : Form
    {
        public Parent()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 form1 = new Form1();
            form1.Show();

        }
    }
}

我的应用程序默认运行父表单...

Application.Run(new Parent());

我面临的问题很奇怪。当我运行应用程序时,父窗体打开,单击按钮时,包含 WPF 控件的子窗口窗体也打开。但是问题是一旦WPF控件窗体弹出,父窗体窗口的大小就会自动缩小(窗口移位,恢复并且控件和字体变小。)。如果我评论“Form1_Load”函数的内容,则父窗口不会缩小。为了检查最坏的情况,我评论了“Form1_Load”中的所有内容,除了

ElementHost ctrlHost = new ElementHost();

线。正如我之前提到的,这条线本身的存在使父窗体缩小。我试图在互联网上广泛搜索这个问题。我无法找到解决方案。请帮我解答。累死了……

【问题讨论】:

  • codeproject.com/Tips/130414/Host-Windows-Form-Controls-in-WPF 请查看此链接,我想请提供您的窗体特定宽度和高度,然后尝试加载您的子用户控件。由于孩子添加内容被添加到您的表单中,并且它知道它需要更多空间,这就是它缩小的原因。
  • 感谢您的 cmets Ashok。我尝试为父窗口设置宽度和高度。但是仍然存在同样的问题...
  • 这方面有什么进展吗?我有完全相同的问题。
  • 有同样的问题。有什么想法吗?

标签: wpf winforms winforms-interop


【解决方案1】:

我在上面评论说我遇到了同样的问题,并且已经解决了。我在这里为其他人写下我的更改。

如上所述,每当在 WinForms 应用程序中使用 Windows UI 缩放并且即时 (JIT) 编译器处理 WPF 库中的任何内容时,似乎都会发生这种行为。在我的例子中,输入一个包含打开 MessageBox 的 WPF 版本的代码的方法将会实现。 通常,Windows 会为您处理基本的缩放,渲染到屏幕外的位图,然后在屏幕上绘制它,但会按比例放大。当 WPF 加载时,它似乎接管了,就好像它对 Windows 说,“嘿..我明白了..”。之后,Windows 停止为您缩放 WinForms,您最终会得到 1x 缩放版本,并且通常会出现一些混乱的控件。然而,WPF 部分正在处理自己的缩放并且看起来很好。

所以我解决它的方法是告诉 Windows 我将处理 WinForms 缩放。要启用它,您必须将其添加到您的应用程序清单中(忽略 dll 清单)

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <dpiAware>true</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

如果以下部分已经存在,请取消注释:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
  </windowsSettings>
</application>

您可以添加清单文件:

Right click on application project -&gt; Add -&gt; New item... -&gt; Application Manifest File

然后在...

Application Project -&gt; Properties -&gt; Application -&gt; Resources

确保“清单”设置为app.manifest

您现在可以找到该文件并将上面的 XML 添加到根 &lt;asmv1:assembly&gt;element。

如果您采用默认应用程序清单并添加了该元素,它可能看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"  xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</asmv1:assembly>

现在,当您启动 WinForms 应用程序时,您会发现它更加清晰,因为它以高 dpi 而不是 96dpi 呈现,然后放大以填充空间。

你可能会注意到你的很多图片都缩小了!! 在我的例子中,Buttons、MenuStripItems 和 ToolStripItems 没有按预期缩放。

我发现大多数控件都有一个可以覆盖的方法,如下所示

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);
}

当应用程序启动并通过主窗体中的控件进行过滤时调用它。我的 Windows 设置为 200%,我的主窗体的缩放模式设置为 DPI,并且所有窗体都设计为 100% 缩放 (96dpi)。我在第一次尝试解决问题以继承缩放模式时更改了所有内容,这对我有用,如果您使用字体或不使用字体,我怀疑它会起作用,但我没有尝试过。

当这个方法被称为 factor 时,我的 UI 缩放比例为 200%,因此我使用它在 Buttons 中重新创建缩放的 Image,并增加 ImageScalingSize on MenuStripToolStrip 中的每一个 Items 因为它们不接收 ScaleControl 调用。如果您从未在上面添加过 XML,则仍会调用此方法,但只会使用 {1.0, 1.0} 作为因子,这没有帮助。 注意:如果您使用的是图像列表,则不要在 DesignMode 中动态设置图像,否则 ImageList 将变为未设置,当您保存时,将不会设置任何内容

也不是那个因素是来自当前的因素。您会注意到,如果您在不同 dpi 显示器之间移动应用程序,您将获得 2.0、0.5、2.0、0.5 等。

现在我的 WinForms 应用程序看起来超级清晰,它可以调用 WPF ui 元素而不会发疯!呸呸呸呸

希望这对某人有所帮助

【讨论】:

  • 非常感谢!就我而言,我必须将其关闭,以便真正让 Windows 处理所有缩放 :)
  • 谢谢。这很有帮助。
猜你喜欢
  • 2012-11-23
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多