有没有办法在运行时创建像xaml bellow这样的子扩展器?
<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 :(得分: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);
答案 1 :(得分:1)
最好的方法可能是使用数据绑定。我假设你有一些数据结构描述了你想要创建的扩展器。我们假设我们有:
class Building
{
public List<Item> Items { get; }
public string Name { get; }
}
class Item
{
public int Number { get; }
}
在我们的用户控件中,我们会将DataContext
设置为Building
的列表(例如在构造函数中):
DataContext = GetListOfBuildings();
然后我们使用带有模板的两个嵌套ItemsControl
来在运行时创建控件:
<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中比较麻烦。
答案 2 :(得分:0)
不太确定你想要达到的目标。
如果我理解正确,您可以将代码保存为.xaml文件作为资源,并使用应用程序加载它。然后,将对象添加到可视树中。
var expander = (Expander) Application.LoadComponent(new Uri("UriToTheXamlFile"));
control.AddChild(expander);