在运行时将控件添加到子控件

时间:2013-02-07 20:10:27

标签: c# wpf xaml

我正在尝试在运行时将控件添加到另一个控件。这就是我到目前为止所做的:

必须在.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”的选项

有没有办法在运行时将控件添加到其父级?

3 个答案:

答案 0 :(得分:0)

您是否尝试过thisChild.AddVisualChild(controlToAdd)?

请参阅文章here

答案 1 :(得分:0)

在Wpf中有两种主要类型的控件:内容控件和项控件。内容控件只有一个可视子对象,另一方面,items控件有许多可视子对象。如果要在运行时和项目中添加可视元素,我认为您必须将该项目转换为项目控件,然后添加所需的项目。希望这可以帮助您解决问题......

答案 2 :(得分:0)

根据您的UI结构,可能会发生许多不同的变化。某些类别的常见元素可能是您StackPanel的孩子:

  • Decorator - 这很可能是Border,但还有其他人。在Child财产上占一个孩子。
  • Panel - StackPanelGridCanvas等。通过添加Children属性,可以拥有任意数量的子项。
  • ContentControl - 除了使用基类本身外,还包括ButtonLabelExpander等内容。可以在Content属性上接受1个孩子,但与Decorator.Child不同,此类型为object,可以接受任何操作。设置的Content也不是Decorator的直接可视树子项,而是注入控件的ControlTemplate。如果将Content设置为非UI元素,则还可以使用DataTemplate模板化。
  • ItemsControl - ListBoxComboBoxItemsControl等。与ContentControl类似,但通过Items或ItemsSource属性获取内容集合(使用略有不同,只能使用其中一种)。通过添加Items或绑定到ItemsSource的任何集合来添加子项。
  • 不带孩子的其他人 - TextBlockTextBoxSlider,以及其他许多孩子。

还有其他可能性,但这些是最常见的。投射到Control并没有给你任何东西,因为那些可以归入最后3个类别中的任何一个并且错过了所有前2个。你应该准确定义你期望在{{1}中找到的内容并限制您接受的类型StackPanel,然后转换为前4种类型中的一种来设置孩子。