Interoperação WPF e Windows Forms
WPF e Windows Forms apresentam duas arquiteturas diferentes para a criação de interfaces de aplicativos. O namespace System.Windows.Forms.Integration fornece classes que permitem cenários comuns de interoperação. As duas classes principais que implementam recursos de interoperação são WindowsFormsHost e ElementHost. Este tópico descreve quais cenários de interoperação são suportados e quais cenários não são suportados.
Observação
É dada especial atenção ao cenário de controlo híbrido. Um controlador híbrido tem um controlador de uma tecnologia inserido num controlador da outra tecnologia. Isso também é chamado de interoperação aninhada. Um de controle híbrido multinível tem mais de um nível de aninhamento de controle híbrido. Um exemplo de uma interoperação aninhada de vários níveis é um controle Windows Forms que contém um controle WPF, que contém outro controle Windows Forms. Não há suporte para controles híbridos multinível.
Hospedando controles do Windows Forms no WPF
Os seguintes cenários de interoperação são suportados quando um controle WPF hospeda um controle Windows Forms:
O controle WPF pode hospedar um ou mais controles Windows Forms usando XAML.
Ele pode hospedar um ou mais controles Windows Forms usando código.
Ele pode hospedar controles de contêiner do Windows Forms que contêm outros controles do Windows Forms.
Ele pode hospedar um formulário mestre/detalhe com um mestre WPF e detalhes do Windows Forms.
Ele pode hospedar um formulário mestre/detalhado com um mestre do Windows Forms e detalhes do WPF.
Ele pode hospedar um ou mais controles ActiveX.
Ele pode hospedar um ou mais controles compostos.
Ele pode hospedar controles híbridos usando Extensible Application Markup Language (XAML).
Ele pode hospedar controles híbridos usando código.
Suporte de layout
A lista a seguir descreve as limitações conhecidas quando o elemento WindowsFormsHost 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 de ComboBox do Windows Forms oferece suporte a apenas uma única altura, que é definida pelo tamanho da fonte do controle. Em um layout dinâmico do WPF, que pressupõe que os elementos podem expandir verticalmente, um controle de ComboBox hospedado não se expandirá conforme o esperado.
Os controles do Windows Forms não podem ser girados ou distorcidos. Por exemplo, quando você gira a interface do usuário em 90 graus, os controles hospedados do Windows Forms manterão sua posição vertical.
Na maioria dos casos, os controles do Windows Forms não oferecem suporte ao dimensionamento proporcional. Embora as dimensões gerais do controle serão dimensionadas, os controles filho e os elementos 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.
Em uma interface de usuário do WPF, você pode alterar a ordem z dos elementos para controlar o comportamento de sobreposição. Um controle Windows Forms hospedado é desenhado em um HWND separado, portanto, ele é sempre desenhado sobre os elementos WPF.
Os controles do Windows Forms oferecem suporte ao dimensionamento automático com base no tamanho da fonte. Em uma interface de usuário do WPF, alterar o tamanho da fonte não redimensiona o layout inteiro, embora elementos individuais possam ser redimensionados dinamicamente.
Propriedades ambientais
Algumas das propriedades ambientais dos controles WPF têm equivalentes do Windows Forms. Essas propriedades de ambiente são propagadas para os controles hospedados do Windows Forms e expostas como propriedades públicas no controle WindowsFormsHost. O controle WindowsFormsHost converte cada propriedade de ambiente WPF em seu equivalente do Windows Forms.
Para obter mais informações, consulte Windows Forms e WPF Property Mapping.
Comportamento
A tabela a seguir descreve o comportamento de interoperação.
Comportamento | Suportado | Não suportado |
---|---|---|
Transparência | A renderização de controle do Windows Forms oferece suporte à transparência. O plano de fundo do controle WPF pai pode tornar-se o plano de fundo dos controles hospedados do Windows Forms. | Alguns controles do Windows Forms não oferecem suporte à transparência. Por exemplo, os controles TextBox e ComboBox não serão transparentes quando hospedados pelo WPF. |
Tabulação | A ordem de tabulação para controles Windows Forms hospedados é a mesma de quando esses controles são hospedados em um aplicativo baseado em Windows Forms. Tabulação de um controle WPF para um controle Windows Forms com a tecla TAB e teclas SHIFT + TAB funciona como de costume. Controlos do Windows Forms com um valor de propriedade TabStop de false não recebem foco quando o utilizador navega pelos controlos.- Cada controle WindowsFormsHost tem um valor TabIndex, que determina quando esse controle WindowsFormsHost receberá foco. - Os controles do Windows Forms contidos dentro de um contêiner WindowsFormsHost seguem a ordem especificada pela propriedade TabIndex. Avançar a partir do último índice de tabulação coloca o foco no controlo WPF seguinte, se existir. Se nenhum outro controle WPF focalizável existir, a tabulação retornará ao primeiro controle Windows Forms na ordem de tabulação. - TabIndex valores para controles dentro do WindowsFormsHost são relativos aos controles irmãos do Windows Forms contidos no controle WindowsFormsHost. - A tabulação respeita o comportamento específico do controlo. Por exemplo, pressionar a tecla TAB em um controle TextBox que tenha um valor de propriedade AcceptsTab de true insere uma guia na caixa de texto em vez de mover o foco. |
Não aplicável. |
Navegação com teclas de seta | - A navegação com as teclas de seta no controle WindowsFormsHost é a mesma que em um controle de contêiner comum do Windows Forms: As teclas de seta para cima e seta para a esquerda selecionam o controle anterior, e as teclas de seta para baixo e seta para a direita selecionam o próximo controle. - As teclas SETA PARA CIMA e SETA PARA A ESQUERDA do primeiro controle contido no controle WindowsFormsHost executam a mesma ação que o atalho de teclado SHIFT+TAB. Se houver um controle WPF focalizável, o foco se move para fora do controle WindowsFormsHost. Esse comportamento difere do comportamento ContainerControl padrão em que nenhum encapsulamento para o último controle ocorre. Se nenhum outro controle WPF focalizável existir, o foco retornará para o último controle Windows Forms na ordem de tabulação. - As teclas SETA PARA BAIXO e SETA PARA A DIREITA do último controle que está contido no controle WindowsFormsHost executam a mesma ação que a tecla TAB. Se houver um controlo WPF que possa ser focalizado, o foco desloca-se para fora do controlo WindowsFormsHost. Esse comportamento difere do comportamento ContainerControl padrão em que nenhum encapsulamento para o primeiro controle ocorre. Se nenhum outro controle WPF focalizável existir, o foco retornará para o primeiro controle Windows Forms na ordem de tabulação. |
Não aplicável. |
Aceleradores | Os aceleradores funcionam normalmente, exceto quando indicado na coluna "Não suportado". | Aceleradores duplicados entre tecnologias não funcionam como aceleradores duplicados comuns. Quando um acelerador é duplicado entre tecnologias, com pelo menos um em um controle Windows Forms e o outro em um controle WPF, o controle Windows Forms sempre recebe o acelerador. O foco não alterna entre os controles quando o acelerador duplicado é pressionado. |
Teclas de atalho | As teclas de atalho funcionam normalmente, exceto onde indicado na coluna "Não suportado". | - As teclas de atalho do Windows Forms que são manipuladas no estágio de pré-processamento sempre têm precedência sobre as teclas de atalho do WPF. Por exemplo, se você tiver um controle ToolStrip com teclas de atalho CTRL+S definidas e houver um comando WPF vinculado a CTRL+S, o manipulador de controle ToolStrip será sempre invocado primeiro, independentemente do foco. - As teclas de atalho do Windows Forms que são manipuladas pelo evento KeyDown são processadas por último no WPF. Você pode evitar esse comportamento substituindo o método IsInputKey do controle Windows Forms ou manipulando o evento PreviewKeyDown. Retorne true do método IsInputKey ou defina o valor da propriedade PreviewKeyDownEventArgs.IsInputKey para true em seu manipulador de eventos PreviewKeyDown. |
AcceptsReturn, AcceptsTab e outros comportamentos específicos do controle | As propriedades que alteram o comportamento padrão do teclado funcionam normalmente, supondo que o controle Windows Forms substitua o método IsInputKey para retornar true . |
Os controles do Windows Forms que alteram o comportamento padrão do teclado manipulando o evento KeyDown são processados por último no controle WPF do host. Como esses controles são processados por último, eles podem produzir um comportamento inesperado. |
Entrar e sair de eventos | Quando o foco não vai para o controlo de contenção ElementHost, os eventos Enter e Leave são gerados como de costume quando o foco muda num único controlo WindowsFormsHost. | Os eventos Enter e Leave não são gerados quando ocorrem as seguintes alterações de foco: - Da parte interna para a externa de um controlo WindowsFormsHost. - Do exterior para o interior de um controlo WindowsFormsHost. - Fora de um WindowsFormsHost controle. - De um controle Windows Forms hospedado em um controle WindowsFormsHost para um controle ElementHost hospedado dentro do mesmo WindowsFormsHost. |
Multithreading | Todas as variedades de multithreading são suportadas. | As tecnologias Windows Forms e WPF assumem um modelo de simultaneidade de thread único. Durante a depuração, chamadas para objetos do framework de outras threads gerarão uma exceção para garantir o cumprimento deste requisito. |
Segurança | Todos os cenários de interoperação exigem confiança total. | Nenhum cenário de interoperação é permitido em confiança parcial. |
Acessibilidade | Todos os cenários de acessibilidade são suportados. Os produtos de tecnologia assistiva funcionam corretamente quando são usados para aplicativos híbridos que contêm controles Windows Forms e WPF. | Não aplicável. |
Área de transferência | Todas as operações da Área de Transferência funcionam normalmente. Isso inclui cortar e colar entre controles Windows Forms e WPF. | Não aplicável. |
Recurso de arrastar e soltar | Todas as operações de arrastar e soltar funcionam normalmente. Isso inclui operações entre controles Windows Forms e WPF. | Não aplicável. |
Hospedando controles WPF no Windows Forms
Os seguintes cenários de interoperação são suportados quando um controle Windows Forms hospeda um controle WPF:
Hospedando um ou mais controles WPF usando código.
Associando uma folha de propriedades a um ou mais controles WPF hospedados.
Hospedar uma ou mais páginas WPF em um formulário.
Iniciando uma janela do WPF.
Hospedagem de um formulário mestre/detalhe com um mestre do Windows Forms e detalhes do WPF.
Hospedagem de um formulário mestre/detalhe com um mestre WPF e detalhes do Windows Forms.
Hospedagem de controles WPF personalizados.
Hospedagem de controles híbridos.
Propriedades ambientais
Algumas das propriedades ambientais dos controles Windows Forms têm equivalentes WPF. Essas propriedades de ambiente são propagadas para os controles WPF hospedados e expõem-se como públicas no controle ElementHost. O controle ElementHost traduz cada propriedade de ambiente do Windows Forms para seu equivalente WPF.
Para obter mais informações, consulte Windows Forms e WPF Property Mapping.
Comportamento
A tabela a seguir descreve o comportamento de interoperação.
Comportamento | Suportado | Não suportado |
---|---|---|
Transparência | A renderização de controle WPF oferece suporte à transparência. O plano de fundo do controle pai do Windows Forms pode se tornar o plano de fundo dos controles WPF hospedados. | Não aplicável. |
Multithreading | Todas as variedades de multithreading são suportadas. | As tecnologias Windows Forms e WPF assumem um modelo de simultaneidade de thread único. Durante a depuração, chamadas para objetos de estrutura de outros threads gerarão uma exceção para impor esse requisito. |
Segurança | Todos os cenários de interoperação exigem confiança total. | Nenhum cenário de interoperação é permitido em confiança parcial. |
Acessibilidade | Todos os cenários de acessibilidade são suportados. Os produtos de tecnologia assistiva funcionam corretamente quando são usados para aplicativos híbridos que contêm controles Windows Forms e WPF. | Não aplicável. |
Área de transferência | Todas as operações da Área de Transferência funcionam normalmente. Isso inclui cortar e colar entre controles Windows Forms e WPF. | Não aplicável. |
Recurso de arrastar e soltar | Todas as operações de arrastar e soltar funcionam normalmente. Isso inclui operações entre controles Windows Forms e WPF. | Não aplicável. |
Ver também
.NET Desktop feedback