我正在尝试在运行时将控件添加到另一个控件。这就是我到目前为止所做的:
必须在.net 3.5
中完成public void addItem(Type addType, Type parentType, string name,string parentName, string fpath)
{
try
{
if (asdf != null)
{
}
else
{
StackPanel stkPnl = (StackPanel)_loadXaml.Content;
foreach (UIElement child in stkPnl.Children)
{
if ((child.GetType() == parentType))
{
Control theChild = (Control)child;
string theChildsName = theChild.Name;
if (theChildsName == parentName)
{
//I want to create and add the control under "theChild"
break;
}
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
AddType:是控件的类型
parentType:是要添加的对象的父类型
name:将要添加的对象的名称
parentName:是创建的对象所在的父级的名称
我试过.Children.Add不是“theChild”的选项 也.content不是“theChild”的选项
有没有办法在运行时将控件添加到其父级?
答案 0 :(得分:0)
您是否尝试过thisChild.AddVisualChild(controlToAdd)?
请参阅文章here
答案 1 :(得分:0)
在Wpf中有两种主要类型的控件:内容控件和项控件。内容控件只有一个可视子对象,另一方面,items控件有许多可视子对象。如果要在运行时和项目中添加可视元素,我认为您必须将该项目转换为项目控件,然后添加所需的项目。希望这可以帮助您解决问题......
答案 2 :(得分:0)
根据您的UI结构,可能会发生许多不同的变化。某些类别的常见元素可能是您StackPanel
的孩子:
Decorator
- 这很可能是Border
,但还有其他人。在Child
财产上占一个孩子。Panel
- StackPanel
,Grid
,Canvas
等。通过添加Children
属性,可以拥有任意数量的子项。ContentControl
- 除了使用基类本身外,还包括Button
,Label
,Expander
等内容。可以在Content
属性上接受1个孩子,但与Decorator.Child
不同,此类型为object
,可以接受任何操作。设置的Content
也不是Decorator
的直接可视树子项,而是注入控件的ControlTemplate
。如果将Content
设置为非UI元素,则还可以使用DataTemplate
模板化。ItemsControl
- ListBox
,ComboBox
,ItemsControl
等。与ContentControl
类似,但通过Items或ItemsSource属性获取内容集合(使用略有不同,只能使用其中一种)。通过添加Items
或绑定到ItemsSource
的任何集合来添加子项。TextBlock
,TextBox
,Slider
,以及其他许多孩子。还有其他可能性,但这些是最常见的。投射到Control
并没有给你任何东西,因为那些可以归入最后3个类别中的任何一个并且错过了所有前2个。你应该准确定义你期望在{{1}中找到的内容并限制您接受的类型StackPanel
,然后转换为前4种类型中的一种来设置孩子。