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
, , ListBox
etc.). 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:
ContentPage
ContentView
ContentPresenter
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
string
s, s,int
etc., 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
XamlReader
o . 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:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{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:
- O objeto deve derivar de
BindableObject
. - Deve haver um campo estático público do tipo
BindableProperty
declarado para definir a chave de armazenamento de backup para a propriedade. - Deve haver um wrapper de propriedade de instância pública que usa
GetValue
e para recuperar eSetValue
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 BindableProperty
arquivo .
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 DataTemplate
s 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 ResourceDictionary
arquivo .
Além disso, eles não são tão flexíveis quanto sua contraparte WPF.
- O elemento raiz do
DataTemplate
deve ser sempre umViewCell
objeto. - 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. DataTemplateSelector
também é suportado, mas deriva deDataTemplate
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 ItemsControl
personalizado para o Xamarin.Forms disponível aqui.
Controles de usuário
No WPF, UserControl
s 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.
Navegação
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.