Динамически добавить дочерний расширитель
Есть ли способ создать дочерние расширители, такие как этот xaml ниже, во время выполнения?
<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>
3 ответа
Установите имя для первой StackPanel (MainStackPanel) под верхним расширителем.
// 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);
Лучшим способом, вероятно, будет использование привязки данных. Я предполагаю, что у вас есть некоторая структура данных, которая описывает, какие расширители вы хотите создать. Давайте предположим, что у нас есть:
class Building
{
public List<Item> Items { get; }
public string Name { get; }
}
class Item
{
public int Number { get; }
}
В нашем пользовательском контроле мы установим DataContext
к списку Building
s (например, в конструкторе):
DataContext = GetListOfBuildings();
Тогда мы будем использовать два вложенных ItemsControl
s с шаблонами для создания элементов управления во время выполнения:
<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>
Таким образом, вам не нужно создавать элементы управления в C#, что является более громоздким в WPF.
Не совсем уверен, что вы хотите достичь.
Если я правильно понимаю, вы можете сохранить свой код в файле.xaml как ресурс и использовать приложение для его загрузки. Затем добавьте объект в визуальное дерево.
var expander = (Expander) Application.LoadComponent(new Uri("UriToTheXamlFile"));
control.AddChild(expander);