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 double int . Nos casos double em 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. |
Propriedades relacionadas ao layout
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:
O WindowsFormsHost elemento substitui os MeasureOverride métodos e ArrangeOverride .
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.
O ArrangeOverride método tenta definir o controle hospedado para a restrição de tamanho fornecida.
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
.NET Desktop feedback