Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态和不可变的UIElement数组_C#_Wpf_Arrays_List_Uielement - Fatal编程技术网

C# 动态和不可变的UIElement数组

C# 动态和不可变的UIElement数组,c#,wpf,arrays,list,uielement,C#,Wpf,Arrays,List,Uielement,我有一个WrapPanel,其中包含多个大小相同的Canvas。每个Canvas都有一些UIElements(即TextBox、TextBlock、按钮等)作为子元素。每个Canvas(包括其UIElement子元素)的创建和要创建的Canvas的数量都是在运行时代码隐藏中完成的(无XAML) 最初,我做了以下工作: // declare as class properties, so all function can access them WrapPanel wp = new WrapPan

我有一个
WrapPanel
,其中包含多个大小相同的
Canvas
。每个
Canvas
都有一些
UIElement
s(即
TextBox
TextBlock
按钮等)作为子元素。每个
Canvas
(包括其
UIElement
子元素)的创建和要创建的
Canvas
的数量都是在运行时代码隐藏中完成的(无XAML)

最初,我做了以下工作:

// declare as class properties, so all function can access them
WrapPanel wp = new WrapPanel();
Canvas[] cv = new Canvas[500];
TextBox[] tb = new TextBox[500];

// A function (e.g. a Button_Click event) that generates multiple Canvas in a WrapPanel
for (int i = 0; i<myInt; i++)
{
cv[i] = new Canvas();
tb[i] = new TextBox();
cv[i].Children.Add(tb[i]);
wp.Children.Add(cv[i]);
}
如果我处理上述3个操作的组合,我可以轻松地创建同一索引的UIElements或创建超出最初声明范围的画布

我查看了列表但是,每个画布都有不同的属性(每个画布也有具有不同属性的UIElement子元素),我不知道列表如何解决它。对于我来说,一种方法是为Canvas声明一个超大数组大小(例如Canvas[]cv=newcanvas[99999],但我认为这不是很有效

此外,如果我使用列表,在生成特定UIElement之后,我如何更改其属性?例如,如果我添加10个画布和add to List,并且在它们全部生成之后,我需要选择第5个画布并更改一个文本框。Text,我如何像在数组中一样访问它(即tb[5]。Text=“Hello”)


有人能告诉我一些解决这个问题的方法吗?

下面是一个列表,这是一个直接的翻译。考虑到你的代码,我不知道你为什么要跟踪列表中的画布和文本框-你可以直接访问
WrapPanel
的子集合-假设你确实需要ese目前有单独的收藏

 WrapPanel wp = new WrapPanel();
 List<Canvas> cvList = new List<Canvas>();
 List<TextBox> tbList = new List<TextBox>();

 public void Init()
{

    int myInt = 500;
    // in a function (e.g. a Button_Click event) to generate the multiple Canvas in a WrapPanel
    for (int i = 0; i < myInt; i++)
    {
        Canvas cv = new Canvas();
        TextBox tb = new TextBox();
        cv.Children.Add(tb);
        wp.Children.Add(cv);

        cvList.Add(cv);
        tbList.Add(tb);
    }
}


public void AddCanvas()
{
    Canvas cv = new Canvas();
    TextBox tb = new TextBox();
    cv.Children.Add(tb);
    wp.Children.Add(cv);
    cvList.Add(cv);
    tbList.Add(tb);
}

public void RemoveCanvas()
{
        wp.Children.RemoveAt(wp.Children.Count-1);
        cvList.RemoveAt(cvList.Count - 1);
        tbList.RemoveAt(cvList.Count - 1);
}

只需直接操作
WrapPanel
的子集合

public partial class MainWindow : Window
{        

    public MainWindow()
    {
        InitializeComponent();
        AddCanvasToWrapPanel(this.TestWrapPanel);
        RemoveLastCanvasFromWrapPanel(this.TestWrapPanel);
        AddCanvasToWrapPanel(this.TestWrapPanel);
        DestroyCanvasAtWrapPanelIndex(this.TestWrapPanel, 0);

    }

    private void AddCanvasToWrapPanel(WrapPanel wp)
    {
        TextBox t = new TextBox();
        Canvas c = new Canvas();
        c.Children.Add(t);
        wp.Children.Add(c);
    }

    private void RemoveLastCanvasFromWrapPanel(WrapPanel wp)
    {
        wp.Children.RemoveAt(wp.Children.Count - 1);
    }

    private void DestroyCanvasAtWrapPanelIndex(WrapPanel wp, int index)
    {
        wp.Children.RemoveAt(index);
    }


}
}

如果你需要一个可以收缩/增长的数组,那么你就需要一个列表。你能详细说明一下为什么列表在你的情况下不起作用吗?@vanja,我编辑了我的问题,希望能澄清这个问题。1.不要使用平行列表。创建一个完整表示每个条目的类型,并保留该类型的单个列表,而不是多个列表,每个列表只包含一个条目这是故事的一部分。2.你真的应该研究一下MVVM。我是@BrokenGlass的-在这种情况下似乎有道理,你只想能够管理WrapPanel集合中的子元素。谢谢。但是我该如何更改特定UIElement的属性呢?例如,如果我添加10个画布,并且在它们全部生成之后,我需要选择e第五个画布并更改文本框。Text,我如何像在数组中一样访问它(即tb[5].Text=“Hello”)?@KMC-Canvas c=(Canvas)wp.Children[4]将在WrapPanel中获得第五个画布。文本框t=(TextBox)c.Children[0]将获得文本框。@KMC:添加到我的答案中,以解释代码中的一个小问题。WrapPanel的索引可能与列表的索引不同。例如,如果我删除列表中的一个项目,列表索引将重新排列,但WrapPanel将在删除的位置有一个空项目。如何同步这两个索引?
TextBox textbox = (wp.Children[5] as Canvas).Children[0] as TextBox;
textbox.Text = "Hello";
public partial class MainWindow : Window
{        

    public MainWindow()
    {
        InitializeComponent();
        AddCanvasToWrapPanel(this.TestWrapPanel);
        RemoveLastCanvasFromWrapPanel(this.TestWrapPanel);
        AddCanvasToWrapPanel(this.TestWrapPanel);
        DestroyCanvasAtWrapPanelIndex(this.TestWrapPanel, 0);

    }

    private void AddCanvasToWrapPanel(WrapPanel wp)
    {
        TextBox t = new TextBox();
        Canvas c = new Canvas();
        c.Children.Add(t);
        wp.Children.Add(c);
    }

    private void RemoveLastCanvasFromWrapPanel(WrapPanel wp)
    {
        wp.Children.RemoveAt(wp.Children.Count - 1);
    }

    private void DestroyCanvasAtWrapPanelIndex(WrapPanel wp, int index)
    {
        wp.Children.RemoveAt(index);
    }


}
}