Compartilhar via


Considerações sobre layout para o elemento WindowsFormsHost

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

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

Diferenças de layout entre Windows Presentation Foundation 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 de dispositivo. Um pixel independente de dispositivo tem 1/96 de uma polegada de tamanho e é independente de resolução, então se obtém resultados semelhantes independentemente de estar se renderizando em um monitor de 72 dpi ou em uma impressora de 19,200 dpi.

O WPF também é baseado em layout dinâmico . Isso significa que um elemento de interface do usuário organiza a si mesmo 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. 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 sequências de caracteres que eles contêm alteram de comprimento.

O layout em Windows Forms é dependente de dispositivo e mais provável de ser estático. Normalmente, os controles Windows Forms são posicionados absolutamente em um formulário usando dimensões especificadas em pixels de hardware. Porém, Windows Forms oferece suporte a alguns recursos de layout dinâmico, como resumidos na tabela a seguir.

Recurso de layout

Descrição

Dimensionamento automático

Alguns controles Windows Forms redimensionar a si mesmos para exibir seu conteúdo corretamente. Para obter mais informações, consulte Visão geral da propriedade AutoDimensionar.

Ancoragem e encaixe

Controles Windows Forms suportam posicionamento e dimensionamento com base no contêiner pai. Para obter mais informações, consulte Control.Anchor e Control.Dock.

Autoescala

Controles contêiner redimensionam a si mesmos e a seus filhos com base na resolução do dispositivo de saída ou no tamanho, em pixels, da fonte padrão do contêiner. Para obter mais informações, consulte Dimensionamento Automático em Formulários do Windows.

Contêineres de layout

Os controles FlowLayoutPanel e TableLayoutPanel organizam seus controles filho e dimensionam a si mesmos de acordo com seu conteúdo.

Limitações de layout

Em geral, controles Windows Forms não podem sofrer escala e transformação tanto quanto no WPF. A lista a seguir descreve as limitações conhecidas quando o elemento WindowsFormsHost tenta integrar seu controle Windows Forms no sistema de layout WPF.

  • Em alguns casos, controles Windows Forms não podem ser redimensionados, ou podem ser dimensionados somente para dimensões específicas. Por exemplo, um controle ComboBox Windows Forms oferece suporte somente a uma única altura, que é definida pela tamanho da fonte do controle. Em um layout WPF dinâmico, onde os elementos podem alongar-se verticalmente, um controle ComboBox hospedado não irá alongar-se conforme o esperado.

  • Controles Windows Forms não podem ser girados ou inclinados. O elemento WindowsFormsHost gera o evento LayoutError se você aplicar uma transformação de distorção ou rotação. Se você não tratar o evento LayoutError, uma InvalidOperationException é gerada.

  • Na maioria dos casos, controles Windows Forms não oferecem suporte à transformação de escala proporcional. Embora as dimensões gerais do controle sejam dimensionadas, controles filho e elementos componentes do controle podem não redimensionados conforme o esperado. Essa limitação depende de quanto cada controle Windows Forms oferece suporte à transformação de escala. Além disso, não é possível redimensionar os controles Windows Forms até um tamanho de 0 pixels.

  • Controles Windows Forms suportam dimensionamento automático, no qual o formulário redimensionará automaticamente a si mesmo e seus controles com base no tamanho da fonte. Em uma interface do usuário WPF, alterar o tamanho da fonte não redimensiona o layout inteiro, embora elementos individuais possam redimensionar dinamicamente.

Ordem em Z

Em uma interface do usuário WPF, você pode alterar o z-order dos elementos para controlar comportamento de sobreposição. Um controle Windows Forms hospedado é desenhado em uma HWND separada, portanto é sempre desenhado por cima de elementos WPF.

Um controle Windows Forms hospedado também é desenhado na parte superior de todos os elementos Adorner.

Comportamento de layout

As seções seguintes descrevem aspectos específicos do comportamento de layout quando se hospeda controles Windows Forms no WPF.

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

Sempre que o WindowsFormsHost elemento realiza operações envolvendo WPF e Windows Forms dimensões, dois sistemas de coordenada estão envolvidas: pixels independentes de dispositivo para WPF e pixels de hardware para Windows Forms. Portanto, você deve aplicar as conversões apropriadas de unidade e de dimensionamento para atingir um layout consistente.

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

Se o dispositivo de saída for de 96 dpi e nenhuma escala foi aplicada ao elemento WindowsFormsHost, um pixel independente de dispositivo é igual a um pixel de hardware.

Todos os outros casos exigem escalar o sistema de coordenadas. O controle hospedado não é redimensionado. Em vez disso, o elemento WindowsFormsHost tenta redimensionar o controle hospedado e todos os seus controles filho. Como Windows Forms não dá suporte completo a escala, o elemento WindowsFormsHost se redimensiona de acordo com o grau suportado pelos controles específicos.

Sobrescreva o método ScaleChild para fornecer um comportamento de escala personalizado ao controle Windows Forms hospedado.

Além de escala, o elemento WindowsFormsHost trata casos de arredondamento e de estouro conforme descrito na tabela a seguir.

Problema de conversão

Descrição

Arredondamento

As dimensões em pixels independentes de dispositivo do WPF são especificadas como double, e as dimensões dos pixels de hardware no Windows Forms são especificadas como int. Em casos em que dimensões representadas por double são convertidas em dimensões representadas por int, o elemento WindowsFormsHost usa arredondamento padrão para que os valores fracionários menores do que 0,5 sejam arredondados para baixo, para 0.

Estouro

Quando o elemento WindowsFormsHost converte valores de double para int, é possível que ocorra estouro. Valores que são maiores do que MaxValue são definidos como MaxValue.

Propriedades relacionados com layout

Propriedades que controlam o comportamento de layout em controles Windows Forms e elementos do WPF são mapeadas corretamente pelo elemento WindowsFormsHost. Para obter mais informações, consulte Formulários do Windows e mapeamento de propriedades do WPF.

Alterações de layout no controle hospedado

Alterações de layout no controle Windows Forms hospedado são propagadas para o WPF para disparar atualizações de layout. O método InvalidateMeasure no WindowsFormsHost assegura que alterações de layout no controle hospedado farão com que o mecanismo de layout do WPF seja executado.

Controles Windows Forms continuamente dimensionados

Controles Windows Forms que suportam 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 Windows Forms hospedado.

Algoritmo de dimensionamento

O elemento WindowsFormsHost utiliza o procedimento a seguir para dimensionar o controle hospedado:

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

  2. Para determinar o tamanho do controle hospedado, o método MeasureOverride chama o método GetPreferredSize do controle hospedado com uma restrição convertida a partir da restrição passada para o método MeasureOverride.

  3. O método ArrangeOverride tenta configurar o controle hospedado de acordo com a restrição de tamanho dada.

  4. Se a propriedade Size do controle hospedado coincide com a restrição especificada, o controle hospedado é redimensionado de acordo com a restrição.

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

  • Se a propriedade Size retorna um tamanho maior do que a restrição especificada, o elemento WindowsFormsHost corta o controle hospedado. Altura e largura são tratados separadamente, portanto, o controle hospedado pode ser cortado em qualquer direção.

  • Se a propriedade Size retorna um tamanho menor do que a restrição especificada, o WindowsFormsHost aceita este valor de tamanho e retorna o valor para o sistema de layout do WPF.

Consulte também

Tarefas

Demonstra Passo a passo: Organizando controles Windows Forms no Windows Presentation Foundation

Organizando controles de formulários do Windows no Windows Presentation Foundation Exemplo

Conceitos

Formulários do Windows e mapeamento de propriedades do WPF

Referência

ElementHost

WindowsFormsHost

Outros recursos

Migração e Interoperabilidade