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 ....
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
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
Tags und Links wpf winforms winforms-interop