öffnendes WPF-Benutzersteuerungs-Winform-Fenster verkleinert das Eltern-Winform-Fenster

8

Ich habe eine WPF Benutzerkontrolle wie diese ...

%Vor%

Ich habe auch ein Gewinnformular, um dieses WPF-Benutzersteuerelement zu enthalten ...

%Vor%

Ich habe ein Elternformular mehr, das einen Knopf hat. Wenn Sie auf die Schaltfläche klicken, wird das Form1 mit dem ElementHost geöffnet.

%Vor%

Meine Anwendung führt das übergeordnete Formular standardmäßig aus ...

%Vor%

Das Problem, vor dem ich stehe, ist seltsam. Wenn ich die Anwendung ausführe, öffnet sich das übergeordnete Formular und beim Klicken auf die Schaltfläche öffnet sich auch das untergeordnete Fensterformular, das das WPF-Steuerelement enthält. Aber das Problem ist die Größe des übergeordneten Formularfensters verkleinert sich automatisch (das Fenster verschiebt sich, stellt sich selbst wieder her und die Steuerelemente und die Schriftart werden darin kleiner.), Sobald das WPF-Steuerformular erscheint. Wenn ich den Inhalt der Funktion "Form1_Load" kommentiere, wird das übergeordnete Fenster nicht verkleinert. Um den schlimmsten Fall zu überprüfen, habe ich alles in 'Form1_Load' mit Ausnahme von

kommentiert %Vor%

Linie. Die bloße Anwesenheit dieser Linie selbst lässt die Elternform schrumpfen, wie ich bereits erwähnt habe. Ich habe versucht, im Internet für dieses Problem ausgiebig zu suchen. Ich konnte keine Lösung finden. Bitte hilf mir mit einer Antwort. Ich bin erschöpft ....

    
balaji 16.10.2014, 18:03
quelle

1 Antwort

7

Ich habe oben gesagt, dass ich das gleiche Problem habe und seitdem gelöst habe. Ich schreibe meine Änderungen hier für jemand anderen auf.

Wie oben erwähnt, tritt das Verhalten auf, wenn die Windows-Benutzeroberflächenskalierung in einer WinForms-Anwendung verwendet wird und der Just In Time (JIT) -Compiler alles aus den WPF-Bibliotheken verarbeitet. In meinem Fall wird die Eingabe einer Methode, die Code enthält, der die WPF-Version von MessageBox öffnet, geschehen. Gewöhnlich wird Windows die grundlegende Skalierung für Sie übernehmen, die zu einem Bitmap-Offscreen rendert und dann auf dem Bildschirm gezeichnet, aber vergrößert wird. Wenn WPF geladen wird, scheint es zu übernehmen, als ob es zu Windows sagt: "Hey .. ich habe das ...". Danach hört Windows auf, die WinForms für Sie zu skalieren, und Sie enden mit der 1x-Maßstabsversion und oft einigen verwirrten Kontrollen. Der WPF-Teil behandelt jedoch seine eigene Skalierung und sieht gut aus.

Also habe ich das Problem gelöst, indem ich Windows gesagt habe, dass ich mit der Skalierung von WinForms umgehen würde. Um dies zu ermöglichen, müssen Sie dies zu Ihrem Anwendungsmanifest hinzufügen (dll manifest wird ignoriert)

%Vor%

ODER den folgenden Abschnitt auskommentieren, wenn er bereits vorhanden ist:

%Vor%

Sie können eine Manifest-Datei hinzufügen:

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

Dann in ...

Application Project -> Properties -> Application -> Resources

Stellen Sie sicher, dass "Manifest" auf app.manifest

eingestellt ist

Sie können diese Datei nun finden und das obige XML in das root <asmv1:assembly> Element einfügen.

Wenn Sie das standardmäßige Anwendungsmanifest genommen und dieses Element hinzugefügt haben, sieht es wahrscheinlich so aus.

%Vor%

Wenn Sie jetzt Ihre WinForms-Anwendung starten, werden Sie feststellen, dass sie deutlich schärfer ist, da sie mit hoher dpi-Auflösung anstatt mit 96 dpi wiedergegeben und dann vergrößert wird, um den verfügbaren Platz zu füllen.

Sie werden wahrscheinlich feststellen, dass viele Ihrer Bilder geschrumpft sind !! In meinem Fall skalierten Buttons, MenuStripItems und ToolStripItems nicht wie gewünscht.

Was ich gefunden habe, war, dass die meisten Steuerelemente eine Methode haben, die Sie wie folgt überschreiben können:

%Vor%

Dies wird aufgerufen, wenn die Anwendung über das Hauptformular gestartet und gefiltert wird. Mein Windows ist auf 200% eingestellt, der Skalierungsmodus meines Hauptformulars wurde auf DPI gesetzt und alle Formulare wurden mit 100% Skalierung (96 dpi) entworfen. Ich änderte alles in meinen ersten Versuchen, das Problem zu beheben, um den Skalierungsmodus zu erben, und das war, was für mich arbeitete, wenn Sie Schriftart oder keine verwenden, ich vermute, dass es genau dasselbe funktioniert, aber ich habe es nicht versucht.

Da meine 200% UI-Skalierung war, wenn diese Methode factor genannt wurde, war es einfach {2.0, 2.0}, die ich dann verwendet, um eine skalierte Image in Button s neu zu erstellen und die ImageScalingSize zu erhöhen jedes Items von MenuStrip und ToolStrip , da diese den ScaleControl-Aufruf nicht erhalten. Wenn Sie das obige XML-Objekt nie hinzugefügt haben, wird diese Methode immer noch aufgerufen, hat aber nur {1.0, 1.0} für factor, was nicht hilfreich ist. Hinweis: Wenn Sie eine Bildliste verwenden, dann setzen Sie das Bild nicht dynamisch, wenn es in DesignMode oder der ImageList nicht gesetzt ist, und wenn Sie speichern, wird nichts gesetzt

Auch nicht dieser Faktor ist ein Faktor aus der aktuellen. Was Sie bemerken werden, ist, wenn Sie die Anwendung zwischen verschiedenen dpi Monitoren bewegen, erhalten Sie 2.0, dann 0.5, dann 2.0, dann 0.5 usw.

Jetzt sieht meine WinForms-Anwendung super knackig aus und kann WPF-Elemente aufrufen, ohne verrückt zu werden! yyayyyyy

Hoffe das hilft jemandem

    
dten 07.04.2015 20:24
quelle

Tags und Links