2012-08-05 5 views
2

Existe-t-il un moyen de créer des extensions enfant comme ce sous-shell xaml, lors de l'exécution?Ajouter dynamiquement expandeur enfant

<Expander Header="Building" IsExpanded="True"> 
    <StackPanel> 
     <Expander Header="Sales"> 
      <StackPanel> 
       <TextBlock>6100</TextBlock> 
       <TextBlock>6101</TextBlock> 
       <TextBlock>6111</TextBlock> 
       <TextBlock>6150</TextBlock> 
      </StackPanel> 
     </Expander> 
     <Expander Header="Director"> 
      <StackPanel> 
       <TextBlock>6102</TextBlock> 
       <TextBlock>6113</TextBlock> 
      </StackPanel> 
     </Expander> 
    </StackPanel> 
</Expander> 
+0

Tags *** ne font pas partie du titre, nous avons une section tag sur ce site, arrêtez d'encombrer le titre. –

Répondre

0

Vous ne savez pas exactement ce que vous voulez réaliser. Si je comprends bien, vous pouvez enregistrer votre code dans un fichier .xaml comme ressource et utiliser l'application pour le charger. Ensuite, ajoutez l'objet à l'arborescence visuelle.

var expander = (Expander) Application.LoadComponent(new Uri("UriToTheXamlFile")); 
    control.AddChild(expander); 
5

Définissez un nom pour le premier StackPanel (MainStackPanel) sous l'Expander supérieur.

// Add new expander, stack panel and text block. 
var newExpander = new Expander {Name = "NewExpander", Header = "New Expander"}; 
var newstackPanel = new StackPanel {Name = "NewExpanderStackPanel"}; 
var newtextBlock = new TextBlock {Text = "777"}; 

// Add above items as children.  
newstackPanel.Children.Add(newtextBlock); 
newExpander.Content = newstackPanel; 
MainStackPanel.Children.Add(newExpander); 
0

Le meilleur moyen serait probablement d'utiliser la liaison de données. Je suppose que vous avez une structure de données qui décrit les expanseurs que vous voulez créer. Supposons que nous avons:

class Building 
{ 
    public List<Item> Items { get; } 
    public string Name { get; } 
} 

class Item 
{ 
    public int Number { get; } 
} 

Dans notre contrôle utilisateur, nous allons définir la DataContext à une liste de Building s (par exemple dans le constructeur):

DataContext = GetListOfBuildings(); 

Ensuite, nous utiliserions deux imbriquée ItemsControl s avec des modèles pour créer les contrôles à l'exécution:

<Expander Header="Building" 
      IsExpanded="True"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Expander Header="{Binding Name}"> 
        <ItemsControl ItemsSource="{Binding Items}" 
            DisplayMemberPath="Number" /> 
       </Expander> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Expander> 

de cette façon, vous auriez pas besoin de créer des contrôles en C#, qui est plus lourd dans WPF.