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 globalControleBase.cs- Classe herdeira deControl
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
- Compile para gerar o assembly
.dll - 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")
});
}
}