Qual é a diferença entre uma biblioteca de controle de usuário e uma biblioteca de controle personalizada?

168

Estou começando a acelerar o WPF e gostaria de criar um controle WPF reutilizável.

Quando olho para as opções para criar projetos no Visual Studio, vejo "WPF User Control Library" e "WPF Custom Control Library". Não está claro para mim qual é a diferença entre eles e minhas pesquisas no Google não apresentaram explicações decentes.

Gostaria de entender as diferenças entre eles e, idealmente, ver alguns exemplos de quando usar um sobre o outro.

17 de 26
fonte
2
Não se esqueça de aninhar conteúdo ou alterar o modelo de um controle como opções. Você pode fazer alterações bastante drásticas em um controle dessa maneira sem precisar escrever um controle personalizado.
MichaC
Exatamente o que MichaC disse. A melhor parte do WPF é que a modelagem dos controles existentes pode ter um enorme impacto. Você deve exigir controles personalizados raramente. Isso é diferente do WinForms, onde mesmo pequenas alterações em um controle exigiam um novo controle derivado.
Mikko Rantanen
Ainda é útil. Tenha outro crachá de ouro.
ouflak

Respostas:

117

Na prática, controles personalizados são algo que você implementa no nível do código enquanto pode usar o XAML para controles do usuário. Os controles personalizados estendem uma das classes base de controle do WPF e fornecem funcionalidade adicional por meio do código, para que toda a lógica e representação adicionadas sejam implementadas dentro do código.

Um controle de usuário é tecnicamente um controle de conteúdo normal que você pode estender em algumas partes do código, mas geralmente é estendido colocando outros controles dentro dele. Assim como Kent mencionou, um UserControl é uma agregação de outros controles. Isso limita consideravelmente o que você pode fazer com um controle de usuário. É mais fácil de usar, mas mais limitado do que um controle personalizado completo.

Esses controles têm uma pequena diferença do ponto de vista do tempo de execução. Ao criar um aplicativo e colocar um UserControl nele, a árvore de controle terá um modelo concreto de UserControl dentro dele. Portanto, se considerarmos um exemplo esfarrapado de um botão especializado. Se você estivesse usando um controle de usuário, adicionaria um botão dentro do <UserControl>elemento. Ao usar um controle personalizado, você derivará o próprio controle de um botão provavelmente. A diferença seria visível na árvore lógica.

Embora o controle personalizado forneça uma árvore lógica semelhante a

  • Janela
    • CustomButton

O UserControl daria uma árvore lógica de

  • Janela
    • CustomButtonUserControl
      • Botão

Portanto, no final, o UserControl é apenas um ContentControl normal, que você pode estender um pouco e para o qual você pode predefinir o conteúdo. O controle personalizado fornece maior flexibilidade ao preço da facilidade de implementação, pois você precisa fazer toda a lógica e interação no código, em vez de ter o benefício do XAML.

Apesar de tudo isso, acho que não há muita diferença nos modelos do Visual Studio. Provavelmente, o Controle Personalizado do Visual Studio apenas cria um projeto com um controle personalizado vazio, enquanto o projeto Controle de Usuário é um projeto com um controle de usuário vazio. Posteriormente, você pode adicionar qualquer tipo de item ao projeto.

Atualizar

E minha opinião sobre quando usar o controle personalizado e o controle do usuário é que, se você pode fazer algo com um controle de usuário e o elemento de controle extra na árvore lógica não o incomoda, use um controle de usuário, pois eles são muito mais fáceis de usar. criar e manter. Use um controle personalizado apenas se você tiver um motivo para não usar um controle de usuário.

Mikko Rantanen
fonte
2
Um controle personalizado pode ser usado para agregar outros controles?
17 de 26
E a questão skinnable / templatable?
17 de 26
1
Não tenho certeza do que você quer dizer com agregação. Você não pode criar um controle personalizado agregando outros controles. No entanto, você pode derivar de um controle Panel, como StackPanel, Grid ou Panel, para implementar um contêiner de layout com um controle personalizado (não tenho certeza se você pode fazer isso com um Controle de Usuário).
Mikko Rantanen
Sim, mas se você quiser apenas agregar outros controles, provavelmente será muito mais fácil fazer com um Controle de Usuário. Dependendo do que você deseja fazer, um controle personalizado pode ser realmente difícil de escrever, e é por isso que você escolheria usar um Controle de Usuário, mesmo que ele forneça apenas um subconjunto dos recursos.
MichaC
1
Ambos os controles devem ser skinnable / templates quando implementados da maneira correta. Infelizmente, minha referência WPF está no escritório atualmente, portanto não posso verificar os detalhes da implementação.
Mikko Rantanen
23

A Controlrepresenta algum comportamento que pode ser skinnable (modelável), enquanto a UserControlgeralmente é uma agregação de Controls de nível mais alto que é específica para um aplicativo.

Mais informações disponíveis aqui .

Kent Boogaart
fonte
3
Esse foi um dos links que achei que não explicava muito bem as coisas :). Eu acho que uma coisa que estou perdendo é o que skinnable / templatable realmente significa e por que isso não pode ser feito com um controle de usuário. Além disso, a última frase da postagem vinculada é "Em termos gerais e simples, os controles personalizados têm melhor flexibilidade e reutilização do que os controles do usuário". Se isso for verdade, por que eu iria querer criar um controle de usuário?
17 de 26