2014-10-16 16 views
8

mam kontrolę użytkownika WPF, jak to ...otwarcie okna kontroli użytkownika WPF winform kurczy okno nadrzędne winform

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

Mam też formę wygrać, aby zawierał tę kontrolę użytkownika 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); 
    } 
} 
} 

Mam jeszcze jeden formularz wygranej dla rodziców, który ma przycisk. Kliknięcie przycisku otworzy Formularz1, który zawiera ElementHost.

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

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

     } 
    } 
} 

Moja aplikacja działa formularza nadrzędnego domyślnie ...

Application.Run(new Parent()); 

Problem mam skierowane jest dziwne. Po uruchomieniu aplikacji formularz rodzicielski otwiera się i po kliknięciu przycisku otwiera się również okienko podrzędne zawierające kontrolkę WPF. Ale problem polega na tym, że rozmiar okna nadrzędnego automatycznie maleje (okno przemieszcza się, odtwarza się, a elementy sterujące i czcionka stają się mniejsze) zaraz po wyskoczeniu formularza kontrolnego WPF. Jeśli skomentuję zawartość funkcji "Form1_Load", okno główne nie zostanie zmniejszone. Aby sprawdzić najgorszy przypadek, skomentowałem wszystko w linii "Form1_Load" z wyjątkiem linii

ElementHost ctrlHost = new ElementHost(); 

. Sama obecność tej linii sprawia, że ​​forma rodzica kurczy się, jak wspomniałem wcześniej. Próbowałem intensywnie szukać w Internecie tego problemu. Nie mogłem znaleźć rozwiązania. Proszę, pomóż mi w odpowiedzi. Jestem wyczerpany ...

+0

http://www.codeproject.com/Tips/130414/Host-Windows-Form-Controls-in-WPF proszę spojrzeć na ten link, myślę, że należy podać formę okna określonej szerokości i wysokości, a następnie próbował załadować kontrolę użytkownika dziecka. Ponieważ z powodu dodawania treści dodawanych przez dziecko do formularza użytkownika wynika, że ​​wymaga on więcej miejsca, dlatego jego kurczenie się zmniejsza. –

+0

dzięki za komentarze Ashok. Próbowałem ustawić szerokość i wysokość dla okna nadrzędnego. Ale wciąż ten sam problem istnieje ... – balaji

+0

Jakieś postępy w tej sprawie? Mam dokładnie ten sam problem. – user958578

Odpowiedz

7

Skomentowałem powyżej, że miałem ten sam problem i od tego czasu go rozwiązałem. Piszę tutaj moje zmiany dla kogokolwiek innego.

Jak zauważono powyżej, zachowanie wydaje się występować zawsze, gdy używa się skalowania interfejsu użytkownika systemu Windows w aplikacji WinForm, a kompilator Just In Time (JIT) przetwarza wszystko z bibliotek WPF. W moim przypadku wpisanie metody zawierającej kod otwierający wersję MessageBox WPF sprawi, że tak się stanie. Zwykle system Windows obsłuży podstawowe skalowanie, renderując bitmapę poza ekranem, a następnie rysując ją na ekranie, ale powiększoną. Kiedy ładuje się WPF, wydaje się, że przejmuje kontrolę, tak jak mówi Windows, "Hej ... mam to ...". Po tym Windows przestaje skalować WinForm dla ciebie, a skończysz z wersją w skali 1x i często z pomieszanymi kontrolkami. Część WPF obsługuje jednak własne skalowanie i wygląda dobrze.

W ten sposób rozwiązałem problem polegający na poinformowaniu Windows, że będę obsługiwał skalowanie WinForm. Aby włączyć, że trzeba dodać to do manifest aplikacji (dll manifest jest ignorowany)

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

LUB odkomentuj następującą sekcję jeśli jest już tam:

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

można dodać plik manifestu :

Right click on application project -> Add -> New item... -> Application Manifest File

Następnie w ...

Application Project -> Properties -> Application -> Resources

Upewnij „manifest” jest ustawiony na app.manifest

Teraz można znaleźć ten plik i dodać XML powyżej do głównego <asmv1:assembly> elementu.

Jeśli podjęte domyślną aplikację oczywisty i dodał ten element to prawdopodobnie wyglądać tak

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

Teraz po uruchomieniu WinForms aplikacja będzie można zauważyć, że o wiele bardziej wyraziste, bo to są renderowane na wysokim DPI zamiast 96dpi, a następnie skalowane, aby wypełnić przestrzeń.

Zapewne zauważysz, że wiele z Twoich zdjęć się skurczyło !! W moim przypadku Przyciski, MenuStripItems i ToolStripItems nie skalowały się zgodnie z potrzebami.

Co znalazłem, że większość kontrole mają metody, które można zastąpić, jak poniżej

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

Nazywa się to wtedy, gdy uruchamia aplikacji i filtry poprzez formantów od głównego formularza. Mój system Windows jest ustawiony na 200%, tryb skalowania głównej formy został ustawiony na DPI, a wszystkie formularze zostały zaprojektowane w skali 100% (96dpi). Zmieniłem wszystko w moich pierwszych próbach naprawienia problemu, aby odziedziczyć tryb skalowania i to było to, co zadziałało dla mnie, jeśli używasz czcionki lub żadnej, podejrzewam, że będzie działać tak samo, ale nie próbowałem tego.

jako kopalnia 200 skalowania% interfejs gdy sposób ten zwany factor po prostu {2.0, 2.0} którą następnie stosuje się do odtworzenia skalowane Image w Button s, a w celu zwiększenia ImageScalingSize na każdy Items z MenuStrip i ToolStrip ponieważ nie otrzymują one połączenia ScaleControl. Jeśli nigdy nie dodałeś powyższego XMLa, to ta metoda jest nadal wywoływana, ale będzie miała współczynnik {1, 1,0} tylko czynnik, co nie jest pomocne. Uwaga: jeśli używasz listy obrazów, nie ustawiaj dynamicznie obrazu, jeśli w trybie DesignMode lub ImageList zostanie rozbrojony, a po zapisaniu nic nie zostanie ustawione

Również ten czynnik nie jest czynnikiem z bieżącego . Zauważysz, że jeśli przeniesiesz aplikację pomiędzy różnymi monitorami dpi, otrzymasz 2,0, następnie 0,5, następnie 2,0, potem 0,5 itd.

Teraz moja aplikacja WinForm wygląda super ostro i może wywoływać elementy WPF ui bez przechodzenia zwariowany! yyayyyyy

Nadzieja to pomaga ktoś

+0

Wielkie dzięki! W moim przypadku musiałem to wyłączyć, aby faktycznie obsługiwać wszystkie skalowania Windows :) – Jerther

+0

Dzięki. To było pomocne. –