2016-04-23 17 views
7

Na początku chciałbym podać kontekst problemu: Mamy dużą starszą aplikację WinForms, którą postanowiliśmy przenieść do WPF. Ale jest to niemożliwe (z wielu powodów, w tym biznesowych), aby całkowicie przerobić aplikację od zera, a my wykonamy tę migrację krok po kroku (jedna forma po drugiej). Na razie musimy używać okien i kontrolek WPF w aplikacji WinForm.Aplikacja WinForms zmienia skalowanie po otwarciu okna WPF z formularza

Dziś zrobiłem pierwszy krok w procesie migracji: Odtworzyłem prostą formę na WPF (stała się Windowsem). Nowe okno, które właśnie utworzyłem ponownie na WPF, otwiera się poprzez naciśnięcie przycisku na innej formie (co jest standardowym formularzem WindowsForms). Ważna uwaga: mój system Windows jest ustawiony na 120 DPI, a nie na domyślną 96. Wszystko było w porządku, dopóki nie uruchomiłem aplikacji, aby zobaczyć, jak wygląda nowe okno.

Oto, co widziałem: Aplikacja zaczęła się normalnie i wyglądała jak zawsze. Otworzyłem formularz "nadrzędny" i nacisnąłem przycisk, aby otworzyć nowe okno WPF. Po naciśnięciu przycisku okno WPF otwarte zgodnie z oczekiwaniami, , ale wszystkie widoczne elementy aplikacji (okno główne, "formularz rodzica", przyciski, paski narzędzi itp.), W tym nowe okno WPF, zwiększyły ich rozmiary, zaczęły wyglądać na większe. To nie wszystko. Kiedy zamknąłem okno WPF, nic nie stało się ze skalą - wszystkie elementy aplikacji pozostały duże. Następnie zamknąłem formularz "nadrzędny", z którego otworzyłem okno WPF. I tu była magia - wszystkie elementy aplikacji zostały przywrócone do pierwotnych rozmiarów. Następnie ponownie otworzyłem formularz "rodzic" i okno WPF - ale skala nie uległa zmianie, wszystkie elementy aplikacji zachowały swoje rozmiary. Powtarzałem wielokrotnie "otwarte-zamknięcie" formularza "rodzica" i WPF (podczas tej samej aplikacji nie uruchomiłem ponownie aplikacji) - brak zmiany rozmiaru elementów.

Po tym dokonałem pewnych badań i doszedłem do tego: Jeśli wstawię dowolny kod, który używa dowolnego typu z zestawów WPF, w pliku Program.cs przed inicjalizacją głównej aplikacji, to aplikacja zawsze będzie rysowała wszystkie jego elemets większy niż poprzednio, ale podczas otwierania okna WPF nie będzie zmiany skali. Przykład pliku Program.cs (w moim przypadku to się nazywa EntryPoint):

internal sealed class EntryPoint 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     try 
     { 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.EnableVisualStyles(); 
      ****System.Windows.Application wpfApp = new System.Windows.Application();****    

      App.Start(args); 
      if(App.Context != null) 
       App.Show(); 
     } 
     catch(Exception ex) 
     { 
      App.ShowError(Properties.Resources.UnexpectedError, ex); 
      Application.Exit(); 
     } 
    } 
} 

Dodałem linię oznaczoną **** (przepraszam, nie może dowiedzieć się, jak sprawić, by linia pogrubione w fragmencie kodu). Podczas kilku testów zrozumiałem, że nie ma znaczenia, jaki kod dodaję - może to być tworzenie nowego obiektu System.Windows.Window nawet bez pokazywania go, lub jakiejkolwiek innej linii kodu, która używa dowolnego typu z zestawów WPF.

Główne pytanie brzmi: co może powodować opisane zachowania? Jeśli ktoś miałby do czynienia z tym problemem lub miałby jakieś pomysły, byłoby świetnie, gdybyś podzielił się swoimi przemyśleniami.

Dziękuję za przeczytanie tego nie tak krótkiego pytania.

+0

Jeśli ktoś używa VB.NET to [odpowiedź na inne podobne pytanie] (https://stackoverflow.com/a/46668038/4676223) może ci pomóc –

Odpowiedz

Powiązane problemy