Compartilhar via


WPF vs. Xamarin.Forms: Semelhanças e Diferenças

Modelos de controle

WPF suporta o conceito de modelos de controle que fornecem as instruções de visualização para um controle (Button, , ListBoxetc.). Como mencionado acima, o Xamarin.Forms usa classes de renderização concretas para isso que interagem com a plataforma nativa (iOS, Android, etc.) para visualizar o controle.

No entanto, Xamarin.Forms tem um ControlTemplate tipo - ele é usado para objetos de tematização Page . Ele fornece uma definição para um Page que fornece conteúdo consistente, mas permite que o usuário da página altere cores, fontes, etc. e até mesmo adicione elementos para torná-lo exclusivo para o aplicativo.

Usos comuns para isso são coisas como caixas de diálogo de autenticação, prompts e para fornecer uma aparência de página padronizada, mas temática, que pode ser personalizada dentro do aplicativo. Como parte desse suporte, muitos controles conhecidos nomeados pelo WPF são usados:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. TemplateBinding

Mas é importante saber que eles não estão servindo ao mesmo propósito no Xamarin.Forms. Para obter mais informações sobre esse recurso, consulte a página de documentação.

XAML

XAML é usado como a linguagem de marcação declarativa para WPF e Xamarin.Forms. Na maioria das vezes, a sintaxe é idêntica - a principal diferença são os objetos definidos/criados pelos gráficos XAML.

  • O Xamarin.Forms oferece suporte à especificação XAML 2009, o que facilita a definição de dados como strings, s, intetc., bem como a definição de tipos genéricos e a passagem de argumentos para construtores.

  • No momento, não há como carregar XAML dinamicamente como o WPF pode com XamlReadero . No entanto, você pode obter a mesma funcionalidade básica com um pacote NuGet.

Extensões de marcação

O Xamarin.Forms oferece suporte à extensão de XAML por meio de extensões de marcação, assim como o WPF. Fora da caixa, ele tem os mesmos blocos de construção básicos:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {x:Type}

Além disso, ele inclui {x:Reference} a especificação XAML 2009 e uma {TemplateBinding} extensão de marcação que é usada para a versão especializada do ControlTemplate Xamarin.Forms com suporte.

Aviso

O ControlTemplate suporte não é o mesmo - embora tenha o mesmo nome.

O Xamarin.Forms também oferece suporte a extensões de marcação personalizadas - mas a implementação é ligeiramente diferente. No WPF, você deve derivar de MarkupExtension - uma classe base abstrata. No Xamarin.Forms, isso é substituído por uma interface IMarkupExtension ou IMarkupExtension<T> que é mais flexível.

Assim como o WPF, o único método necessário é um ProvideValue método para retornar o valor da extensão de marcação.

Infraestrutura vinculativa

Um dos principais conceitos transportados é uma infraestrutura de vinculação de dados para conectar propriedades visuais a propriedades de dados .NET. Isso habilita padrões de arquitetura, como MVVM. O design básico é idêntico - você tem uma classe base vinculável BindableObject, no WPF essa é a classe DependencyObject. Essa classe base é usada como o ancestral raiz para todos os objetos que participarão como destinos na vinculação de dados. As classes derivadas expõem objetos BindableProperty que atuam como armazenamento de backup para valores de propriedade (eles são definidos como objetos DependencyProperty no WPF).

Definindo propriedades vinculáveis

A definição para uma propriedade vinculável no Xamarin.Forms é a mesma do WPF:

  1. O objeto deve derivar de BindableObject.
  2. Deve haver um campo estático público do tipo BindableProperty declarado para definir a chave de armazenamento de backup para a propriedade.
  3. Deve haver um wrapper de propriedade de instância pública que usa GetValue e para recuperar e SetValue alterar o valor das propriedades.

Para obter um exemplo completo, consulte Propriedades vinculáveis em Xamarin.Forms.

Propriedades anexadas

As propriedades anexadas são um subconjunto da propriedade vinculável e funcionam da mesma forma que no WPF. A principal diferença é que o wrapper de propriedade é omitido nesse caso e substituído por um conjunto de métodos estáticos get/set na classe proprietária. Consulte Propriedades anexadas no Xamarin.Forms para obter mais informações.

Usando o mecanismo de vinculação

O processo para usar o mecanismo de vinculação é o mesmo do WPF. Ele pode ser utilizado em code-behind criando um objeto vinculado a um objeto de origem (qualquer tipo .NET) e um Binding valor de propriedade opcional (se omitido, ele trata o objeto de origem como a própria propriedade - assim como WPF). Em seguida, você pode usar SetBinding em qualquer BindableObject um para associar a associação a um BindablePropertyarquivo .

Como alternativa, você pode definir a relação de vinculação em XAML usando o BindingExtension. Ele tem os mesmos valores básicos que a extensão no WPF.

O suporte e o mecanismo de vinculação são mais semelhantes à implementação do Silverlight do que ao WPF. Há vários recursos ausentes que não foram implementados no Xamarin.Forms:

  • Não há suporte para os seguintes recursos em associações:
    • BindingGroupName
    • BindsDirectlyToSource
    • IsAsync
    • MultiBinding
    • NotifyOnSourceUpdated
    • NotifyOnTargetUpdated
    • NotifyOnValidationError
    • UpdateFonteTrigger
    • UpdateSourceExceptionFilter
    • ValidatesOnDataErrors
    • ValidatesOnExceptions
    • Coleção ValidationRules
    • XPath
    • XmlNamespaceManager

Fonte Relativa

Não há suporte para RelativeSource vinculações. No WPF, eles permitem que você se vincule a outros elementos visuais definidos em XAML. No Xamarin.Forms, esse mesmo recurso pode ser obtido usando a {x:Reference} extensão de marcação. Por exemplo, supondo que tenhamos um controle com o nome "otherControl" que tenha uma propriedade Text, podemos vincular a ele assim:

WPF

Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}

Xamarin.Forms

Text={Binding Source={x:Reference otherControl}, Path=Text}

O mesmo recurso pode ser usado para o {RelativeSource Self} recurso. No entanto, não há suporte para localizar ancestrais por tipo ({RelativeSource FindAncestor}).

Contexto de vinculação

No WPF, você pode definir um valor de DataContext propriedade que repõe a fonte de vinculação padrão. Se a origem de uma associação não estiver definida, esse valor de propriedade será usado. O valor é herdado na árvore visual, permitindo que ele seja definido em um nível mais alto e, em seguida, usado por crianças.

No Xamarin.Forms, esse mesmo recurso está disponível, mas o nome da propriedade é BindingContext.

Conversores de valor

Os conversores de valor são totalmente suportados no Xamarin.Forms - assim como o WPF. A mesma forma de interface é usada, mas Xamarin.Forms tem a interface definida no Xamarin.Forms namespace.

Model-View-ViewModel

MVVM é completamente suportado por WPF e Xamarin.Forms.

WPF inclui um construído no RoutedCommand qual às vezes é usado; O Xamarin.Forms não tem suporte a comandos internos além da definição de ICommand interface. Você pode incluir uma variedade de estruturas MVVM para adicionar as classes base necessárias para implementar o MVVM.

INotifyPropertyChanged e INotifyCollectionChanged

Ambas as interfaces são totalmente suportadas em associações Xamarin.Forms. Ao contrário de muitas estruturas baseadas em XAML, as notificações de alteração de propriedade podem ser geradas em threads em segundo plano no Xamarin.Forms (assim como o WPF) e o mecanismo de vinculação fará a transição apropriada para o thread da interface do usuário.

Além disso, ambos os ambientes suportam SynchronizationContext e async/await fazem o empacotamento de threads adequado. WPF inclui a Dispatcher classe em todos os elementos visuais, Xamarin.Forms tem um método Device.BeginInvokeOnMainThread estático que também pode ser usado (embora SynchronizationContext seja preferido para codificação multiplataforma).

  • O Xamarin.Forms inclui um que oferece suporte a notificações de alteração de ObservableCollection<T> coleção.
  • Você pode usar BindingBase.EnableCollectionSynchronization para habilitar atualizações entre threads para uma coleção. A API é ligeiramente diferente da variação WPF, verifique os documentos para obter detalhes de uso.

Modelos de dados

Há suporte para modelos de dados no Xamarin.Forms para personalizar a renderização de uma ListView linha (célula). Ao contrário do WPF, que pode utilizar DataTemplates para qualquer controle orientado a conteúdo, o Xamarin.Forms atualmente só os usa para ListView. A definição de modelo pode ser definida embutida ItemTemplate (atribuída à propriedade) ou como um recurso em um ResourceDictionaryarquivo .

Além disso, eles não são tão flexíveis quanto sua contraparte WPF.

  1. O elemento raiz do DataTemplate deve ser sempre um ViewCell objeto.
  2. Os Gatilhos de Dados têm suporte total em um Modelo de Dados, mas devem incluir uma DataType propriedade indicando o tipo da propriedade à qual o gatilho está associado.
  3. DataTemplateSelector também é suportado, mas deriva de DataTemplate e, portanto, é apenas atribuído diretamente à ItemTemplate propriedade (vs. ItemTemplateSelector no WPF).

ItemsControl

Não há um equivalente interno a um no Xamarin.Forms, mas há um ItemsControlpersonalizado para o Xamarin.Forms disponível aqui.

Controles de usuário

No WPF, UserControls são usados para fornecer uma seção da interface do usuário que tem comportamento associado. No Xamarin.Forms, usamos o ContentView para a mesma finalidade. Ambos oferecem suporte à vinculação e à inclusão em XAML.

WPF inclui um raramente usado que poderia ser usado NavigationService para fornecer um recurso de navegação "browser-like". No entanto, a maioria dos aplicativos não se preocupou com isso e, em vez disso, usou elementos diferentes ou seções diferentes Window da janela para exibir dados.

Em dispositivos telefônicos, telas diferentes são muitas vezes a solução e, portanto, Xamarin.Forms inclui suporte para várias formas de navegação:

Estilo de navegação Tipo de Página
Baseado em pilha (push/pop) NavigationPage
Mestre/Detalhes MasterDetailPage
Tabulações TabbedPage
Deslize para a esquerda/direita CarouselView

A NavigationPage é a abordagem mais comum, e cada página tem uma Navigation propriedade que pode ser usada para enviar ou colocar páginas dentro e fora da pilha de navegação. Este é o equivalente mais próximo do NavigationService encontrado no WPF.

Navegação por URL

WPF é uma tecnologia orientada a desktop e pode aceitar parâmetros de linha de comando para direcionar o comportamento de inicialização. O Xamarin.Forms pode usar a vinculação profunda de URL para ir para uma página na inicialização.