2009-12-05 3 views
1

Après contrôle personnalisé est créé il fichier est apparu automatiquement le code C# - MyCustomControl.cs:Où devrait être mis XAML pour la mise en page du contrôle personnalisé dans WPF?

public class MyCustomControl : ContentControl { 
    static MyCustomControl() { 
     ... 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), 
     new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
     } 
     ... 
} 

et fichier pour défaut stile - Thèmes \ generic.xaml:

<!-- themes/generic.xaml --> 
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomControlLib"> 
    <Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
     <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}"> 
     <ContentPresenter /> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Mais où et comment Je place correctement le code XAML pour la mise en page et le contenu de Custom Control lui-même?

Répondre

3

La disposition (par défaut) et le contenu du contrôle personnalisé sont définis par ControlTemplate dans generic.xaml. Vous devriez donc mettre la mise en page et le contenu dans l'élément ControlTemplate qui a été généré pour vous. (Notez que le ContentPresenter affichera le contenu fourni par les utilisateurs de votre contrôle: vous devez seulement fournir le «contenu» qui fait partie de votre modèle, par exemple dans une case à cocher, votre modèle fournirait le petit carré mais le contenu utilisateur fournirait la légende

+0

Oui, j'essaie de le faire mais dans ce cas, j'obtiens une erreur: "La propriété 'Arbre visuel' est définie plus d'une fois" (si je mets un élément à côté de l'élément "Border") ou property'Child 'est défini plus d'une fois "(si je mets plus de deux éléments dans l'élément" Border ""). Ce que je fais mal? – rem

+1

Il semble que je me rends compte: je devrais simplement ajouter un élément d'emballage, quelque chose comme StackPanel ou similaire .. Merci! – rem

Questions connexes