2

有没有办法在运行时创建像这样的 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>
4

3 回答 3

5

为顶部扩展器下的第一个 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);
于 2012-08-06T05:07:23.523 回答
1

最好的方法可能是使用数据绑定。我假设您有一些数据结构来描述您想要创建的扩展器。假设我们有:

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

class Item
{
    public int Number { get; }
}

在我们的用户控件中,我们将设置DataContextBuildings 列表(例如在构造函数中):

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 中更麻烦。

于 2012-08-06T05:32:18.287 回答
0

不太确定您想要达到的目标。

如果我理解正确,您可以将代码保存在 .xaml 文件中作为资源并使用应用程序加载它。然后,将该对象添加到可视化树中。

  var expander = (Expander) Application.LoadComponent(new Uri("UriToTheXamlFile"));
  control.AddChild(expander);
于 2012-08-06T03:33:06.670 回答