Opcje układu dla elementu WindowsFormsHost

W tym temacie opisano sposób WindowsFormsHost interakcji elementu 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 WindowsFormsHost element 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 jeden dziewięćdziesiąt szósty cal rozmiaru i niezależnego od rozdzielczości, więc uzyskujesz podobne wyniki niezależnie od tego, czy renderujesz monitor 72 dpi, czy drukarkę o rozdzielczości 19 200 dpi.

WPF jest również oparty na układzie dynamicznym. 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
Autodopasowanie rozmiaru Niektóre kontrolki Windows Forms zmieniają rozmiar, aby prawidłowo wyświetlać ich zawartość. Aby uzyskać więcej informacji, zobacz AutoSize Property Overview (Omówienie właściwości AutoSize).
Zakotwiczenie i dokowanie Kontrolki Windows Forms obsługują pozycjonowanie i ustalanie rozmiaru na podstawie kontenera nadrzędnego. Aby uzyskać więcej informacji, zobacz tematy Control.Anchor oraz Control.Dock.
Skalowanie automatyczne Kontrolki kontenera zmieniają rozmiar i ich elementy podrzędne na podstawie 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ą kontrolki podrzędne i mają same rozmiary zgodnie z ich 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 WindowsFormsHost element 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 lub może mieć rozmiar tylko do określonych wymiarów. Na przykład kontrolka Formularze systemu ComboBox Windows 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 ComboBox kontrolka nie będzie rozciągać się zgodnie z oczekiwaniami.

  • Nie można obracać ani niesymetrycznych kontrolek formularzy systemu Windows. Element WindowsFormsHost zgłasza zdarzenie w przypadku zastosowania przekształcenia niesymetryczności LayoutError lub rotacji. Jeśli nie obsłużysz LayoutError zdarzenia, zostanie zgłoszony element 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 Formularze systemu Windows obsługują skalowanie automatyczne, w którym formularz automatycznie zmienia rozmiar i jego kontrolki 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 osi Z

W interfejsie użytkownika WPF można zmienić kolejność elementów z, aby kontrolować nakładające się zachowanie. Hostowana kontrolka Formularze systemu Windows jest rysowana w osobnym HWND, więc zawsze jest rysowana na podstawie elementów WPF.

Hostowana kontrolka Windows Forms jest również rysowana na wszystkich elementach 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

WindowsFormsHost Za każdym razem, gdy element wykonuje operacje obejmujące wymiary WPF i Windows Forms, są zaangażowane dwa systemy współrzędnych: piksele niezależne od urządzenia dla WPF i pikseli sprzętu dla formularzy 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 WindowsFormsHost elementu lub jego elementów nadrzędnych.

Jeśli urządzenie wyjściowe ma 96 dpi i nie zastosowano skalowania do WindowsFormsHost elementu, jeden piksel niezależny od urządzenia jest równy jednemu pikselowi sprzętowemu.

Wszystkie inne przypadki wymagają współrzędnych skalowania systemu. Nie zmieniono rozmiaru hostowanej kontrolki. WindowsFormsHost Zamiast tego element próbuje skalować hostowaną kontrolkę i wszystkie jej kontrolki podrzędne. Ponieważ formularze systemu Windows nie obsługują w pełni skalowania, WindowsFormsHost element jest skalowany do stopnia obsługiwanego przez określone kontrolki.

Zastąpij metodę ScaleChild w celu zapewnienia niestandardowego zachowania skalowania dla hostowanej kontrolki Windows Forms.

Oprócz skalowania WindowsFormsHost , element obsługuje zaokrąglanie i przepełnienie przypadków zgodnie z opisem w poniższej tabeli.

Problem z konwersją opis
Zaokrąglenie 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, w których doublewymiary oparte są konwertowane na intwymiary oparte, WindowsFormsHost element używa standardowej zaokrąglania, dzięki czemu wartości ułamkowe mniejsze niż 0,5 są zaokrąglane w dół do 0.
Przepełnienie WindowsFormsHost Gdy element konwertuje wartości na double wartościint, możliwe jest przepełnienie. Wartości większe niż MaxValue są ustawione na MaxValuewartość .

Właściwości kontrolujące zachowanie układu w kontrolkach Windows Forms i elementach WPF są odpowiednio mapowane przez WindowsFormsHost element. Aby uzyskać więcej informacji, zobacz Windows Forms and WPF Property Mapping (Mapowanie właściwości systemu Windows i WPF).

Zmiany układu w kontrolce hostowanej

Zmiany układu w hostowanej kontrolce Formularze systemu Windows są propagowane do WPF w celu wyzwolenia aktualizacji układu. Metoda InvalidateMeasure on WindowsFormsHost zapewnia, że zmiany układu w hostowanej kontrolce powodują uruchomienie aparatu 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 i ArrangeOverride jak zwykle do rozmiaru MeasureOverride i rozmieszczania hostowanej kontrolki Windows Forms.

Algorytm określania rozmiaru

Element WindowsFormsHost używa następującej procedury do rozmiaru hostowanej kontrolki:

  1. Element WindowsFormsHost zastępuje MeasureOverride metody i ArrangeOverride .

  2. Aby określić rozmiar hostowanej kontrolki, MeasureOverride metoda wywołuje metodę hostowanej kontrolki GetPreferredSize z ograniczeniem przetłumaczonym z ograniczenia przekazanego MeasureOverride do metody .

  3. Metoda ArrangeOverride próbuje ustawić hostowaną kontrolkę na podane ograniczenie rozmiaru.

  4. Jeśli właściwość hostowanej kontrolki Size jest zgodna z określonym ograniczeniem, hostowana kontrolka ma rozmiar ograniczenia.

Jeśli właściwość nie jest zgodna Size z określonym ograniczeniem, hostowana kontrolka nie obsługuje ciągłego określania rozmiaru. Na przykład kontrolka MonthCalendar zezwala tylko na odrębne 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 WindowsFormsHost przypadkach element zachowuje się w następujący sposób:

  • Size Jeśli właściwość zwraca większy rozmiar niż określone ograniczenie, WindowsFormsHost element wycina hostowaną kontrolkę. Wysokość i szerokość są obsługiwane oddzielnie, więc hostowana kontrolka może być obcięta w obu kierunkach.

  • Size Jeśli właściwość zwraca mniejszy rozmiar niż określone ograniczenie, WindowsFormsHost akceptuje tę wartość rozmiaru i zwraca wartość do systemu układu WPF.

Zobacz też