2009-12-03 10 views
2

J'apprends Silverlight. Dans le processus, j'essaie de créer un contrôle utilisateur personnalisé. Mon but ultime est de pouvoir écrire la déclaration suivante en XAML:Silverlight - Liaison de contrôle utilisateur

<my:CustomControl> 
    <my:CustomControl.MainControl> 
    <Canvas><TextBlock Text="Hello!" /></Canvas> 
    </my:CustomControl.MainContent> 
</my:CustomControl> 

Le contenu du contrôle sera enveloppé dans une bordure personnalisée. Encore une fois, c'est juste un exercice d'apprentissage. Pour ajouter ma frontière, je crée le UserControl suivant:

<UserControl x:Class="CustomControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> 

    <Grid x:Name="LayoutRoot"> 
     <Border> 
     <!-- CustomControl Content --> 
     </Border> 
    </Grid> 
</UserControl> 

Le code-behind pour ce fichier se présente comme suit:

public partial class CustomControl : UserControl 
{ 
    public UIElement MainContent 
    { 
    get { return (UIElement)GetValue(MainContentProperty); } 
    set { SetValue(MainContentProperty, value); } 
    } 

    public static readonly DependencyProperty MainContentProperty = 
    DependencyProperty.Register("MainContent", typeof(UIElement), typeof(CustomControl), 
    new PropertyMetadata(null)); 


    public CustomControl() 
    { 
    InitializeComponent();    
    } 
} 

La chose que je suis un problème avec est d'obtenir le Maincontent apparaître dans mon CustomControl. Je suis confiant que je le mets correctement, mais je ne suis pas sûr de savoir comment l'afficher. Je veux vraiment que ce soit un DependencyProperty ainsi je peux tirer parti de la liaison de données et des animations.

Comment faire pour que MainContent s'affiche dans le CustomControl? Merci

Répondre

2

D'abord, vous devez attendre jusqu'à ce que le reste de la commande a été analysé afin que vous devez connecter l'événement chargé: -

public CustomControl() 
{ 
    InitializeComponent(); 
    Loaded += new RoutedEventHandler(CustomControl_Loaded); 
} 

Ensuite, en cas chargé affecter votre propriété MainControl à la propriété de l'enfant de la frontière. Pour faire de son mieux si vous donnez à votre frontière un x:Name qui pour l'instant je vais simplement appeler "frontière".

void CustomControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    border.Child = MainControl; 
} 

Ça va vous mettre en route. Bien sûr, vous devrez peut-être gérer la modification de la propriété MainControl de façon dynamique. Vous devez donc ajouter un champ bool isLoaded dans votre contrôle et le définir dans l'événement chargé. Si vrai, votre setter MainControl doit affecter la valeur entrante au border.Child.

Les choses peuvent commencer à devenir plus compliquées et en fait, je ne recommande pas cette approche pour créer un contrôle personnalisé. Pour une meilleure approche, voir Creating a New Control by Creating a ControlTemplate

Questions connexes