2014-10-16 118 views
8

我有这样一个WPF用户控件...开放WPF用户控件的winform窗口缩小父的winform窗口

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

我也有一个双赢的形式包含该WPF用户控件...

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(); 

line。这条线本身的存在使得父窗体缩小,正如我前面提到的那样。我试图在互联网上广泛搜索这个问题。我无法找到解决方案。请帮我解答。我用尽....

+0

http://www.codeproject.com/Tips/130414/Host-Windows-Form-Controls-in-WPF请看这个环节,我想请提供您的窗口形式特定的宽度和高度,然后尝试加载您的子级用户控件。由于孩子添加内容被添加到你的表格,它知道它需要更多的空间,这就是为什么它缩小。 – 2014-10-17 02:57:52

+0

感谢您的宝贵意见Ashok。我试着设置父窗口的宽度和高度。但仍然存在相同的问题... – balaji 2014-10-17 07:10:22

+0

这方面的进展如何?我有完全一样的问题。 – user958578 2015-02-12 11:02:51

回答

7

我上面评论说,我有同样的问题,并自解决它。我正在为其他人撰写我的更改。

如上所观察的行为似乎只要在WinForms应用程序和即时(JIT)编译器使用的Windows UI缩放处理来自WPF库事情发生。在我的情况下,输入一个包含打开MessageBox的WPF版本的代码的方法将会发生。 通常,Windows会为您处理基本的缩放比例,呈现为偏离屏幕的位图,然后在屏幕上绘制,但放大。当WPF加载它似乎接管,就好像它对Windows说的,“嘿..我得到了这个..”。之后,Windows停止为您扩展WinForms,并最终得到1倍缩放版本,并经常出现一些混淆控件。然而,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 -> Add -> New item... -> Application Manifest File

然后在...

Application Project -> Properties -> Application -> Resources

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

您现在可以找到文件,并添加上面的XML到根<asmv1:assembly>元素。

如果你已经采取了默认的应用程序清单,并补充说,元素,当你开始你的WinForms应用程序,你会发现它要更清晰,因为它在高DPI渲染它可能看起来像这样

<?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> 

现在而不是96dpi,然后放大以填满空间。

您可能会注意到很多图像缩小了! 在我的情况下,按钮,MenuStripItems和ToolStripItems没有按需要缩放。

我发现那是什么大多数控件都有,你可以重写如下

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

这就是所谓的方法,应用程序启动时和过滤器通过你的控制从主要形式。我的Windows设置为200%,我的主窗体的缩放模式设置为DPI,所有窗体都设计为100%(96dpi)。在第一次尝试修复问题以继承缩放模式时,我改变了一切,如果你使用字体或者没有使用字体,我认为它会起作用,但我没有尝试过。

如矿是,当此方法被称为factor只是200%UI缩放{2.0,2.0}我然后用于重新缩放ImageButton S,并增加在每个MenuStripItemsImageScalingSizeToolStrip,因为它们没有收到ScaleControl调用。如果你从来没有添加过XML,那么这个方法仍然被调用,但只会有{1.0,1.0}的因子,这是没有用的。 注意:如果您使用的图像列表,然后不要动态设置图像,如果在DesignMode或ImageList将变为未设置,并且当您保存时则不会设置任何东西

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

现在我的WinForms应用程序看起来超级清爽,它可以调用WPF UI元素,疯! yyayyyyy

希望这可以帮助别人

+0

非常感谢!在我的情况下,我不得不关闭所以让窗口处理所有缩放:) – Jerther 2015-12-03 16:57:20

+0

谢谢。这很有帮助。 – 2017-07-13 02:33:04