Динамически добавить дочерний расширитель

Есть ли способ создать дочерние расширители, такие как этот 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 к списку Buildings (например, в конструкторе):

DataContext = GetListOfBuildings();

Тогда мы будем использовать два вложенных ItemsControls с шаблонами для создания элементов управления во время выполнения:

<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);
Другие вопросы по тегам