2014-10-16 91 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