2009-11-21 4 views

Répondre

21

Je vous recommande vivement de jeter un oeil à Prism, car les interfaces utilisateur composites sont ce à quoi il sert. Cependant, comme cela nécessiterait de refactoriser l'ensemble de votre demande, je répondrai directement à votre question.

Si vous souhaitez un contrôle utilisateur unique dans un conteneur, placez un contrôle ContentControl dans votre code XAML, puis définissez la propriété Content. Si vous utilisez un modèle de vue, vous pouvez lier le contenu à une propriété FrameworkElement sur le modèle de vue:

contentControlInstance.Content = new CustomUserControl(); 

Si vous souhaitez plusieurs contrôles dans une liste, utilisez un ItemsControl et assignez un ObservableCollection <> à la propriété ItemsSource . Si vous utilisez un modèle de vue, vous pouvez lier ItemsSource à une propriété ObservableCollection sur le modèle View.

Ensuite, vous pouvez simplement ajouter/supprimer des vues de cette ObservableCollection:

private ObservableCollection<FrameworkElement> views = 
    new ObservableCollection<FrameworkElement>(); 

private void Initialize() 
{ 
    itemsControl.ItemsSource = views; 
} 

private void AddView(FrameworkElement frameworkElement) 
{ 
    views.Add(frameworkElement); 
} 
4

Pour ajouter plusieurs commandes dont vous avez besoin conteneur.

Supposons que vous ayez un conteneur StackPanel « MyStack »

<Window ..> 
    <StackPanel Name="MyStack" /> 
</Window> 

Vous pouvez créer dynamiquement le contrôle et l'ajouter au conteneur. Voir code ci-dessous

void AddButtons() 
{ 
    Button B1=new Button(),B2=new Button(), B3=new Button(); 
    B1.Content="Hello"; 
    B2.Content="First";  
    B3.content="Application"; 
    // Now you can set more properties like height, width, margin etc... 
    MyStack.Children.Add(B1); 
    MyStack.Children.Add(B2); 
    MyStack.Children.Add(B2);  
} 
3

Ou utiliser la liaison. Voici un exemple très grossier montrant comment différents contrôles WPF peuvent être affichés dans une seule fenêtre WPF en utilisant ContentControl et binding (ce que fait un toolkit comme Prism ou Caliburn Micro).

XAML:

<UserControl x:Class="ViewA"> 
    ... 
<UserControl/> 

<UserControl x:Class="ViewB"> 
    ... 
<UserControl/> 

code:

void ShowViewModelDialog (object viewModel) 
{ 
    var host = new MyViewHost(); 
    FrameworkElement control = null; 
    string viewModelName = viewModel.GetType().Name; 
    switch (viewModelName) 
    { 
    case ("ViewModelA"): 
     control = new ViewA(); 
     break; 
    case ("ViewModelB"): 
     control = new ViewB(); 
     break; 
    default: 
     control = new TextBlock {Text = String.Format ("No view for {0}", viewModelName); 
     break; 
    } 

    if (control!=null) control.DataContext = viewModel; 
    host.DataContext = control; 
    host.Show(); // Host window will show either ViewA, ViewB, or TextBlock. 
} 
Questions connexes