Zagadnienia dotyczące układu elementu WindowsFormsHost
W tym temacie opisano sposób interakcji elementu WindowsFormsHost z systemem układu WPF.
WPF i Windows Forms obsługują różne, ale podobne logiki określania rozmiaru i pozycjonowania elementów na formularzu lub stronie. Podczas tworzenia hybrydowego interfejsu użytkownika obsługującego kontrolki Windows Forms w WPF element WindowsFormsHost integruje dwa schematy układu.
Różnice w układzie między WPF i Windows Forms
WPF używa układu niezależnego od rozdzielczości. Wszystkie wymiary układu WPF są określane przy użyciu pikseli niezależnych od urządzenia. Piksel niezależny od urządzenia to jedna dziewięćdziesiąta szósta cala i niezależny od rozdzielczości, więc uzyskujesz podobne wyniki niezależnie od tego, czy renderujesz na monitor o rozdzielczości 72 dpi, czy na drukarkę o rozdzielczości 19 200 dpi.
Platforma WPF jest również oparta na dynamicznym układzie. Oznacza to, że element interfejsu użytkownika rozmieszcza się na formularzu lub stronie zgodnie z jego zawartością, kontenerem układu nadrzędnego i dostępnym rozmiarem ekranu. Układ dynamiczny ułatwia lokalizację, automatycznie dostosowując rozmiar i położenie elementów interfejsu użytkownika, gdy ciągi, które zawierają, zmieniają długość.
Układ w formularzach Windows Forms jest zależny od urządzenia i prawdopodobnie będzie statyczny. Zazwyczaj kontrolki Windows Forms są ustawiane absolutnie na formularzu przy użyciu wymiarów określonych w pikselach sprzętu. Jednak formularze systemu Windows obsługują niektóre funkcje układu dynamicznego, jak podsumowano w poniższej tabeli.
Funkcja układu | Opis |
---|---|
Automatyczne skalowanie | Niektóre kontrolki Windows Forms zmieniają rozmiar, aby prawidłowo wyświetlać ich zawartość. Aby uzyskać więcej informacji, zobacz AutoSize Property Overview. |
Zakotwiczenie i dokowanie | Kontrolki Windows Forms obsługują pozycjonowanie i ustalanie rozmiaru na podstawie kontenera nadrzędnego. Aby uzyskać więcej informacji, zobacz Control.Anchor i Control.Dock. |
Skalowanie automatyczne | Kontrolki kontenera zmieniają rozmiar wraz z ich elementami podrzędnymi w zależności od rozdzielczości urządzenia wyjściowego lub rozmiaru w pikselach domyślnej czcionki kontenera. Aby uzyskać więcej informacji, zobacz Automatyczne Skalowanie w Formularzach Systemu Windows. |
Kontenery układu | Kontrolki FlowLayoutPanel i TableLayoutPanel rozmieszczają swoje kontrolki podrzędne i dostosowują swój rozmiar zgodnie z zawartością. |
Ograniczenia układu
Ogólnie rzecz biorąc, kontrolki Windows Forms nie mogą być skalowane i przekształcane w zakresie możliwym w WPF. Na poniższej liście opisano znane ograniczenia, gdy element WindowsFormsHost próbuje zintegrować hostowaną kontrolkę Windows Forms z systemem układu WPF.
W niektórych przypadkach nie można zmienić rozmiaru kontrolek formularzy systemu Windows, albo można je ustawić tylko na określone wymiary. Na przykład kontrolka windows Forms ComboBox obsługuje tylko jedną wysokość, która jest definiowana przez rozmiar czcionki kontrolki. W układzie dynamicznym WPF, w którym elementy mogą rozciągać się w pionie, hostowana kontrolka ComboBox nie będzie rozciągać się zgodnie z oczekiwaniami.
Nie można obracać ani pochylać kontrolek Windows Forms. Element WindowsFormsHost zgłasza zdarzenie LayoutError, jeśli zastosujesz przekształcenie pochylenia lub rotacji. Jeśli nie obsłużysz zdarzenia LayoutError, pojawi się InvalidOperationException.
W większości przypadków kontrolki Windows Forms nie obsługują skalowania proporcjonalnego. Mimo że ogólne wymiary kontrolki będą skalowane, kontrolki podrzędne i elementy składowe kontrolki mogą nie zmieniać rozmiaru zgodnie z oczekiwaniami. To ograniczenie zależy od tego, jak dobrze każda kontrolka Windows Forms obsługuje skalowanie. Ponadto nie można skalować kontrolek Windows Forms w dół do rozmiaru 0 pikseli.
Kontrolki Windows Forms obsługują skalowanie automatyczne, dzięki któremu formularz automatycznie zmienia swój rozmiar oraz rozmiar swoich kontrolek na podstawie rozmiaru czcionki. W interfejsie użytkownika WPF zmiana rozmiaru czcionki nie zmienia rozmiaru całego układu, chociaż poszczególne elementy mogą dynamicznie zmieniać rozmiar.
Porządek Z
W interfejsie użytkownika WPF można zmienić kolejność elementów z, aby kontrolować nakładające się zachowanie. Kontrolka Windows Forms jest rysowana w osobnym HWND, więc zawsze znajduje się nad elementami WPF.
Hostowana kontrolka Windows Forms jest również rysowana nad wszelkimi elementami Adorner.
Zachowanie układu
W poniższych sekcjach opisano konkretne aspekty zachowania układu podczas hostowania kontrolek Windows Forms w WPF.
Skalowanie, konwersja jednostek i niezależność urządzenia
Za każdym razem, gdy element WindowsFormsHost wykonuje operacje obejmujące wymiary WPF i Windows Forms, związane są dwa systemy współrzędnych: niezależne od urządzenia piksele dla WPF i piksele sprzętowe dla Windows Forms. W związku z tym należy zastosować odpowiednie konwersje jednostek i skalowania, aby osiągnąć spójny układ.
Konwersja między systemami współrzędnych zależy od bieżącej rozdzielczości urządzenia i wszelkich przekształceń układu lub renderowania zastosowanych do elementu WindowsFormsHost lub jego elementów nadrzędnych.
Jeśli urządzenie wyjściowe ma wartość 96 dpi i nie zastosowano skalowania do elementu WindowsFormsHost, jeden piksel niezależny od urządzenia jest równy jednemu pikselowi sprzętowemu.
Wszystkie inne przypadki wymagają skalowania układu współrzędnych. Nie zmieniono rozmiaru hostowanej kontrolki. Zamiast tego element WindowsFormsHost próbuje skalować hostowaną kontrolkę i wszystkie jej kontrolki podrzędne. Ponieważ formularze systemu Windows nie obsługują w pełni skalowania, element WindowsFormsHost skaluje się do stopnia obsługiwanego przez określone kontrolki.
Zastąp metodę ScaleChild, aby zapewnić niestandardowe zachowanie skalowania dla hostowanej kontrolki Windows Forms.
Oprócz skalowania element WindowsFormsHost obsługuje przypadki zaokrąglania i przepełnienia, jak opisano w poniższej tabeli.
Problem z konwersją | Opis |
---|---|
Zaokrąglanie | Wymiary pikseli niezależne od urządzenia WPF są określane jako double , a wymiary pikseli sprzętu windows Forms są określane jako int . W przypadkach, gdy wymiary oparte na double są konwertowane na wymiary oparte na int , element WindowsFormsHost używa standardowego zaokrąglania, co sprawia, że wartości ułamkowe mniejsze niż 0,5 są zaokrąglane w dół do 0. |
Przepełnienie | Gdy element WindowsFormsHost konwertuje wartości z double na wartości int , możliwe jest przepełnienie. Wartości większe niż MaxValue są ustawione na wartość MaxValue. |
Właściwości związane z układem
Właściwości kontrolujące zachowanie układu w kontrolkach Windows Forms i elementach WPF są odpowiednio mapowane przez element WindowsFormsHost. Aby uzyskać więcej informacji, zobacz Windows Forms i mapowanie właściwości WPF.
Zmiany układu w kontrolce hostowanej
Zmiany układu w hostowanej kontrolce Windows Forms są propagowane do WPF, aby wyzwolić aktualizacje układu. Metoda InvalidateMeasure na WindowsFormsHost zapewnia, że zmiany w układzie hostowanej kontrolki powodują uruchomienie mechanizmu układu WPF.
Kontrolki formularzy systemu Windows o stałym rozmiarze
Kontrolki Windows Forms, które obsługują ciągłe skalowanie w pełni współdziałają z systemem układu WPF. Element WindowsFormsHost używa metod MeasureOverride i ArrangeOverride jak zwykle do rozmiaru i rozmieszczania hostowanej kontrolki Windows Forms.
Algorytm określania rozmiaru
Element WindowsFormsHost używa następującej procedury do rozmiaru hostowanej kontrolki:
Element WindowsFormsHost zastępuje metody MeasureOverride i ArrangeOverride.
Aby określić rozmiar hostowanej kontrolki, metoda MeasureOverride wywołuje metodę GetPreferredSize hostowanej kontrolki z ograniczeniem przetłumaczonym z ograniczenia przekazanego do metody MeasureOverride.
Metoda ArrangeOverride próbuje ustawić hostowaną kontrolkę na podane ograniczenie rozmiaru.
Jeśli właściwość Size hostowanej kontrolki jest zgodna z określonym ograniczeniem, kontrolka jest dostosowywana do tego ograniczenia.
Jeśli właściwość Size nie jest zgodna z określonym ograniczeniem, hostowana kontrolka nie obsługuje ciągłego określania rozmiaru. Na przykład kontrolka MonthCalendar zezwala tylko na dyskretne rozmiary. Dozwolone rozmiary dla tej kontrolki składają się z liczb całkowitych (reprezentujących liczbę miesięcy) zarówno dla wysokości, jak i szerokości. W takich przypadkach element WindowsFormsHost zachowuje się w następujący sposób:
Jeśli właściwość Size zwraca większy rozmiar niż określone ograniczenie, element WindowsFormsHost przycina hostowaną kontrolkę. Wysokość i szerokość są obsługiwane oddzielnie, więc hostowana kontrolka może być obcięta w obu kierunkach.
Jeśli właściwość Size zwraca mniejszy rozmiar niż określone ograniczenie, WindowsFormsHost akceptuje tę wartość rozmiaru i zwraca wartość do systemu układu WPF.
Zobacz też
.NET Desktop feedback