Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve como o elemento WindowsFormsHost interage com o sistema de layout do WPF.
O WPF e o Windows Forms dão suporte a lógicas diferentes, mas semelhantes, para dimensionar e posicionar elementos em um formulário ou página. Quando você cria uma interface do usuário híbrida (interface do usuário) que hospeda controles do Windows Forms no WPF, o elemento WindowsFormsHost integra os dois esquemas de layout.
Diferenças no layout entre o WPF e o Windows Forms
O WPF usa layout independente de resolução. Todas as dimensões de layout do WPF são especificadas usando pixels independentes de dispositivo. Um pixel independente do dispositivo é um noventa e sexto de polegada de tamanho e independente de resolução, portanto, você obtém resultados semelhantes independentemente de estar renderizando para um monitor de 72 dpi ou uma impressora de 19.200 dpi.
WPF também se baseia em layout dinâmico
O layout nos Windows Forms depende do dispositivo e é mais provável que seja estático. Normalmente, os controles do Windows Forms são posicionados absolutamente em um formulário usando dimensões especificadas em pixels de hardware. No entanto, o Windows Forms dá suporte a alguns recursos de layout dinâmico, conforme resumido na tabela a seguir.
| Recurso de layout | Descrição |
|---|---|
| Dimensionamento automático | Alguns controles do Windows Forms redimensionam-se para exibir seu conteúdo corretamente. Para obter mais informações, consulte Visão Geral da Propriedade AutoSize. |
| Ancoragem e encaixe | Os controles do Windows Forms dão suporte ao posicionamento e ao dimensionamento com base no contêiner pai. Para obter mais informações, consulte Control.Anchor e Control.Dock. |
| Dimensionamento automático | Os controles contêiner se redimensionam e redimensionam seus filhos com base na resolução do dispositivo de saída ou o tamanho, em pixels, da fonte padrão do contêiner. Para obter mais informações, consulte Dimensionamento automático nos Windows Forms. |
| Contêineres de layout | Os controles FlowLayoutPanel e TableLayoutPanel organizam os controles filho deles e se dimensionam de acordo com o conteúdo dos mesmos. |
Limitações de layout
Em geral, os controles do Windows Forms não podem ser dimensionados e transformados na medida do possível no WPF. A lista a seguir descreve as limitações conhecidas quando o elemento WindowsFormsHost tenta integrar seu controle hospedado do Windows Forms ao sistema de layout do WPF.
Em alguns casos, os controles do Windows Forms não podem ser redimensionados ou podem ser dimensionados apenas para dimensões específicas. Por exemplo, um controle ComboBox do Windows Forms dá suporte a apenas uma única altura, que é definida pelo tamanho da fonte do controle. Em um layout dinâmico do WPF onde os elementos podem se expandir verticalmente, um controle ComboBox incorporado não se expandirá como esperado.
Os controles do Windows Forms não podem ser girados ou distorcidos. O elemento WindowsFormsHost gerará o evento LayoutError se você aplicar uma transformação de distorção ou rotação. Se você não manipular o evento LayoutError, um InvalidOperationException será gerado.
Na maioria dos casos, os controles do Windows Forms não dão suporte ao dimensionamento proporcional. Embora as dimensões gerais do controle sejam dimensionadas, os controles filho e os elementos de componentes do controle podem não ser redimensionados conforme o esperado. Essa limitação depende de quão bem cada controle do Windows Forms dá suporte ao dimensionamento. Além disso, você não pode dimensionar os controles do Windows Forms para um tamanho de 0 pixels.
Os controles do Windows Forms dão suporte ao dimensionamento automático, no qual o formulário será redimensionado automaticamente e seus controles com base no tamanho da fonte. Em uma interface do usuário do WPF, alterar o tamanho da fonte não redimensiona todo o layout, embora elementos individuais possam redimensionar dinamicamente.
Ordem Z
Em uma interface do usuário do WPF, você pode alterar a ordem z dos elementos para controlar o comportamento sobreposto. Um controle do Windows Forms hospedado é desenhado em uma HWND separada, portanto, é sempre desenhado na parte superior dos elementos WPF.
Um controle hospedado do Windows Forms também é desenhado sobre qualquer elemento Adorner.
Comportamento de layout
As seções a seguir descrevem aspectos específicos do comportamento do layout ao hospedar controles do Windows Forms no WPF.
Dimensionamento, conversão de unidade e independência do dispositivo
Sempre que o elemento WindowsFormsHost executa operações envolvendo dimensões do WPF e do Windows Forms, dois sistemas de coordenadas estão envolvidos: pixels independentes de dispositivo para WPF e pixels de hardware para Windows Forms. Portanto, você deve aplicar conversões de unidade e dimensionamento adequadas para obter um layout consistente.
A conversão entre os sistemas de coordenadas depende da resolução atual do dispositivo e de quaisquer transformações de layout ou renderização aplicadas ao elemento WindowsFormsHost ou a seus ancestrais.
Se o dispositivo de saída for 96 dpi e nenhum dimensionamento tiver sido aplicado ao elemento WindowsFormsHost, um pixel independente do dispositivo será igual a um pixel de hardware.
Todos os outros casos exigem dimensionamento de sistema de coordenadas. O controle hospedado não é redimensionado. Em vez disso, o elemento WindowsFormsHost tenta dimensionar o controle hospedado e todos os controles filho. Como o Windows Forms não dá suporte total ao dimensionamento, o elemento WindowsFormsHost é dimensionado até o grau suportado por controles específicos.
Substitua o método ScaleChild para fornecer comportamento de dimensionamento personalizado para o controle hospedado do Windows Forms.
Além do dimensionamento, o elemento WindowsFormsHost manipula casos de arredondamento e estouro, conforme descrito na tabela a seguir.
| Problema de conversão | Descrição |
|---|---|
| Arredondamento | Dimensões de pixel independentes do dispositivo WPF são especificadas como doublee dimensões de pixel de hardware do Windows Forms são especificadas como int. Nos casos em que as dimensões baseadas em doublesão convertidas em dimensões baseadas em int, o elemento WindowsFormsHost usa arredondamento padrão, de modo que valores fracionários menores que 0,5 sejam arredondados para 0. |
| Estouro | Quando o elemento WindowsFormsHost é convertido de valores double para valores int, pode ocorrer um estouro. Valores maiores que MaxValue são definidos como MaxValue. |
Propriedades relacionadas ao layout
As propriedades que controlam o comportamento de layout em controles do Windows Forms e elementos WPF são mapeadas adequadamente pelo elemento WindowsFormsHost. Para obter mais informações, consulte Windows Forms e Mapeamento de Propriedades do WPF.
Alterações de layout no controle hospedado
As alterações de layout no controle hospedado do Windows Forms são propagadas para o WPF para disparar atualizações de layout. O método InvalidateMeasure em WindowsFormsHost garante que as alterações de layout no controle hospedado causem a execução do mecanismo de layout do WPF.
Controles do Windows Forms com ajuste contínuo de tamanho
Os controles do Windows Forms que dão suporte ao dimensionamento contínuo interagem totalmente com o sistema de layout do WPF. O elemento WindowsFormsHost usa os métodos MeasureOverride e ArrangeOverride como de costume para dimensionar e organizar o controle hospedado do Windows Forms.
Algoritmo de dimensionamento
O elemento WindowsFormsHost usa o seguinte procedimento para dimensionar o controle hospedado:
O elemento WindowsFormsHost substitui os métodos MeasureOverride e ArrangeOverride.
Para determinar o tamanho do controle hospedado, o método MeasureOverride chama o método GetPreferredSize do controle hospedado com uma restrição traduzida da restrição passada para o método MeasureOverride.
O método ArrangeOverride tenta definir o controle hospedado para a restrição de tamanho fornecida.
Se a propriedade Size do controle hospedado corresponder à restrição especificada, o controle hospedado será dimensionado para a restrição.
Se a propriedade Size não corresponder à restrição especificada, o controle hospedado não oferecerá suporte ao dimensionamento contínuo. Por exemplo, o controle MonthCalendar permite apenas tamanhos discretos. Os tamanhos permitidos para esse controle consistem em inteiros (representando o número de meses) para altura e largura. Em casos como este, o elemento WindowsFormsHost se comporta da seguinte maneira:
Se a propriedade Size retornar um tamanho maior do que a restrição especificada, o elemento WindowsFormsHost cortará o controle hospedado. Altura e largura são tratadas separadamente, portanto, o controle hospedado pode ser recortado em qualquer direção.
Se a propriedade Size retornar um tamanho menor do que a restrição especificada, WindowsFormsHost aceitará esse valor de tamanho e retornará o valor para o sistema de layout do WPF.
Consulte também
.NET Desktop feedback