Considerações sobre o layout do elemento WindowsFormsHost

Este tópico descreve como o elemento interage com o WindowsFormsHost sistema de layout WPF.

O WPF e o Windows Forms oferecem 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 (UI) que hospeda controles do Windows Forms no WPF, o WindowsFormsHost elemento integra os dois esquemas de layout.

Diferenças de Layout entre WPF e Windows Forms

O WPF usa layout independente de resolução. Todas as dimensões de layout do WPF são especificadas usando pixels independentes do dispositivo. Um pixel independente de dispositivo é um sobre noventa e seis avos de polegada em tamanho e independente de resolução, assim, você obtém resultados semelhantes independentemente de se está processando um monitor de 72 dpi ou uma impressora 19.200 dpi.

WPF também é baseado em layout dinâmico. Isso significa que um elemento de interface do usuário se organiza em um formulário ou página de acordo com seu conteúdo, seu contêiner de layout pai e o tamanho de tela disponível. O layout dinâmico facilita a localização ao ajustar automaticamente o tamanho e a posição dos elementos da interface do usuário quando as cadeias de caracteres que eles contêm alteram de comprimento.

O layout no Windows Forms depende do dispositivo e tem maior probabilidade de ser 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 oferece 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 se redimensionam 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 oferecem 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 FlowLayoutPanel controles e organizam seus controles filhos e TableLayoutPanel se dimensionam de acordo com seu conteúdo.

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 WindowsFormsHost elemento tenta integrar seu controle Windows Forms hospedado no sistema de layout 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 Windows Forms ComboBox oferece 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 estender verticalmente, um controle hospedado ComboBox não se estenderá conforme o esperado.

  • Os controles do Windows Forms não podem ser girados ou distorcidos. O WindowsFormsHost elemento gera o LayoutError evento se você aplicar uma transformação de inclinação ou rotação. Se você não manipular o LayoutError evento, um InvalidOperationException será gerado.

  • Na maioria dos casos, os controles do Windows Forms não oferecem 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 oferece suporte ao dimensionamento. Além disso, você não pode dimensionar controles do Windows Forms para um tamanho de 0 pixels.

  • Os controles do Windows Forms oferecem 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 de usuário WPF, alterar o tamanho da fonte não redimensiona todo o layout, embora elementos individuais possam redimensionar dinamicamente.

Ordem z

Em uma interface de usuário WPF, você pode alterar a ordem z dos elementos para controlar o comportamento de sobreposição. Um controle hospedado do Windows Forms é desenhado em um HWND separado, portanto, ele é sempre desenhado sobre os elementos do WPF.

Um controle hospedado do Windows Forms também é desenhado sobre quaisquer Adorner elementos.

Comportamento de layout

As seções a seguir descrevem aspectos específicos do comportamento de layout ao hospedar controles do Windows Forms no WPF.

Dimensionamento, conversão de unidade e independência de dispositivo

Sempre que o WindowsFormsHost elemento executa operações envolvendo dimensões WPF e 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 a unidade apropriada e conversões de dimensionamento para atingir um layout consistente.

A conversão entre os sistemas de coordenadas depende da resolução atual do dispositivo e de qualquer layout ou transformação de renderização aplicada ao WindowsFormsHost elemento ou a seus ancestrais.

Se o dispositivo de saída for de 96 dpi e nenhum dimensionamento tiver sido aplicado ao WindowsFormsHost elemento, um pixel independente do dispositivo será igual a um pixel de hardware.

Todos os outros casos requerem o dimensionamento do sistema de coordenadas. O controle hospedado não é redimensionado. Em vez disso, o elemento tenta dimensionar o WindowsFormsHost controle hospedado e todos os seus controles filho. Como o Windows Forms não oferece suporte total ao dimensionamento, o elemento é dimensionado no grau suportado WindowsFormsHost por controles específicos.

Substitua o método para fornecer comportamento de dimensionamento personalizado para o ScaleChild controle Windows Forms hospedado.

Além do dimensionamento, o WindowsFormsHost elemento lida com casos de arredondamento e estouro conforme descrito na tabela a seguir.

Tipo de conversão Descrição
Arredondamento As dimensões de pixel independentes de dispositivo WPF são especificadas como , e as dimensões de pixel de hardware do Windows Forms são especificadas como doubleint. Nos casos doubleem que as dimensões baseadas são convertidas em dimensões baseadas em int, o elemento usa arredondamento padrão, de WindowsFormsHost modo que valores fracionários menores que 0,5 sejam arredondados para 0.
Estouro Quando o elemento converte de double valores em int valores, o WindowsFormsHost estouro é possível. Valores maiores que MaxValue os definidos como MaxValue.

As propriedades que controlam o comportamento do layout nos controles do WindowsFormsHost Windows Forms e nos elementos WPF são mapeadas adequadamente pelo elemento . Para mais informações, consulte Windows Forms e mapeamento de propriedade do WPF.

Alterações de layout no controle hospedado

As alterações de layout no controle Windows Forms hospedado são propagadas para o WPF para disparar atualizações de layout. O InvalidateMeasure método em WindowsFormsHost garante que as alterações de layout no controle hospedado façam com que o mecanismo de layout WPF seja executado.

Controles dos Windows Forms dimensionados continuamente

Os controles do Windows Forms que oferecem suporte ao dimensionamento contínuo interagem totalmente com o sistema de layout WPF. O WindowsFormsHost elemento usa os MeasureOverride métodos e como de costume para dimensionar e ArrangeOverride organizar o controle Windows Forms hospedado.

Algoritmo de dimensionamento

O WindowsFormsHost elemento usa o seguinte procedimento para dimensionar o controle hospedado:

  1. O WindowsFormsHost elemento substitui os MeasureOverride métodos e ArrangeOverride .

  2. Para determinar o tamanho do controle hospedado, o método chama o método do GetPreferredSize controle hospedado com uma restrição traduzida da restrição passada para o MeasureOverrideMeasureOverride método.

  3. O ArrangeOverride método tenta definir o controle hospedado para a restrição de tamanho fornecida.

  4. Se a propriedade do Size controle hospedado corresponder à restrição especificada, o controle hospedado será dimensionado para a restrição.

Se a Size propriedade não corresponder à restrição especificada, o controle hospedado não oferecerá suporte ao dimensionamento contínuo. Por exemplo, o MonthCalendar controle permite apenas tamanhos discretos. Os tamanhos permitidos para este controle consistem em números inteiros (representando o número de meses) para altura e largura. Em casos como este, o WindowsFormsHost elemento se comporta da seguinte maneira:

  • Se a propriedade retornar um tamanho maior do que a Size restrição especificada, o elemento cortará o WindowsFormsHost controle hospedado. Altura e largura são tratadas separadamente, portanto, o controle hospedado pode ser recortado em qualquer direção.

  • Se a propriedade retornar um tamanho menor do que a Size restrição especificada, WindowsFormsHost aceitará esse valor de tamanho e retornará o valor para o sistema de layout WPF.

Confira também