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ś
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. –
dzięki za komentarze Ashok. Próbowałem ustawić szerokość i wysokość dla okna nadrzędnego. Ale wciąż ten sam problem istnieje ... – balaji
Jakieś postępy w tej sprawie? Mam dokładnie ten sam problem. – user958578