Desenvolvendo uma Biblioteca de Controles Personalizados em WPF

Em projetos WPF, bibliotecas de controles padronizados garantem consistência visual. Siga estes passos para criar sua biblioteca:

1. Estrutura Inicial do Projeto

Adicione novo projeto do tipo Biblioteca de Controle Personalizado WPF via Gerenciador de Soluções. Dois arquivos serão gerados:

  • Generic.xaml - Dicionário de recursos global
  • ControleBase.cs - Classe herdeira de Control
public class ControleBase : Control
{
    static ControleBase()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(ControleBase), 
            new FrameworkPropertyMetadata(typeof(ControleBase)));
    }
}

2. Gestão de Recursos Visuais

Para novos dicionários de recursos (ex: PainelEstilos.xaml), inclua-os no Generic.xaml:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Meu.Projeto.UI;component/Temas/PainelEstilos.xaml"/>
</ResourceDictionary.MergedDictionaries>

3. Controle Personalizado Exemplo

PainelEstilos.xaml define o template visual:

<Style TargetType="local:PainelAgrupado">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:PainelAgrupado">
                <Grid Background="{TemplateBinding Fundo}">
                    <!-- Estrutura do painel -->
                    <Border Background="{TemplateBinding CabecalhoFundo}">
                        <ContentPresenter Content="{TemplateBinding Cabecalho}"/>
                    </Border>
                    <ContentPresenter Grid.Row="1"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

PainelAgrupado.cs implementa propreidades:

public class PainelAgrupado : HeaderedContentControl
{
    public static readonly DependencyProperty CabecalhoFundoProperty =
        DependencyProperty.Register(
            "CabecalhoFundo", 
            typeof(Brush), 
            typeof(PainelAgrupado));

    public Brush CabecalhoFundo
    {
        get => (Brush)GetValue(CabecalhoFundoProperty);
        set => SetValue(CabecalhoFundoProperty, value);
    }

    // Outras propriedades omitidas para brevidade
}

4. Compilação e Utilização

  1. Compile para gerar o assembly .dll
  2. Em projetos consumidores:
    • Adicione referência ao assembly
    • Declare namespace XAML: xmlns:meusControles="clr-namespace:Meu.Projeto.UI;assembly=Meu.Projeto.UI"
    • Use o controle: <meusControles:PainelAgrupado/>

Solução para Erro Comum

Se criar Biblioteca de Classe em vez de Biblioteca de Controle, ajuste o carregamento de recursos:

public class BotaoCustomizado : Button
{
    public BotaoCustomizado()
    {
        Resources.MergedDictionaries.Add(
            new ResourceDictionary {
                Source = new Uri(
                    "pack://application:,,,/Meu.Projeto.UI;component/Temas/Generic.xaml")
            });
    }
}

Tags: WPF ControlesPersonalizados XAML ResourceDictionary DependencyProperty

Publicado em 7-13 10:19