gpt4 book ai didi

c# - 动态和不可变的 UIElement 数组

转载 作者:行者123 更新时间:2023-11-30 21:15:48 24 4
gpt4 key购买 nike

我有一个 WrapPanel,其中包含多个相同大小的 Canvas。每个 Canvas 都有一些 UIElement(即 TextBoxTextBlockButton 等) ) 作为 child 。每个 Canvas(包括它的 UIElement child )的创建和要创建的 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]);
}

上面的代码是直截了当的工作正常 - 直到我实现添加,减去和销毁按钮,我可以

1. Add an additional `Canvas` on a click event
2. Remove the last `Canvas` on a click event
3. Destroy a specific `Canvas` in the `WrapPanel` on a click event (may ba a little cross icon in each `Canvas`)

如果我处理上述 3 个操作的某种组合,我可以轻松地创建具有相同索引的 UIElement 或创建超出最初声明范围的 Canvas。

我查看了 List 但是,每个 Canvas 都有不同的属性(每个 Canvas 也有具有不同属性的 UIElement Children),我无法弄清楚 List 如何解决它。我解决这个问题的一种方法是为 Canvas 声明一个超大的数组大小(例如 Canvas[] cv = new Canvas[99999] 但我认为这不是很有效。

此外,如果我使用 List,如何在生成特定 UIElement 的属性后更改它们?例如。如果我添加 10 个 Canvas 并添加到列表,并且在它们全部生成后,我需要选择第 5 个 Canvas 并更改一个 TextBox.Text,我如何像在数组中那样访问它(即 tb[5].Text = "你好")?

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

最佳答案

只是直接翻译如何使用下面的列表来执行此操作。鉴于您的代码,我不知道您为什么要跟踪列表中的 Canvas 和文本框 - 您可以直接访问 WrapPanel 的子集合 - 假设您确实需要现在这些单独的集合。

 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);
}

编辑以添加评论:

E.g. If i add 10 Canvas, and after they are all generated, I need to select the 5th Canvas and change a TextBox.Text, how do I access it like I did in an Array (i.e. tb[5].Text = "Hello")?

您可以直接访问 child 。您知道您只向 WrapPanel 添加了 Canvas 元素。所以你可以这样做(wp 又是 WrapPanel):

TextBox textbox = (wp.Children[5] as Canvas).Children[0] as TextBox;
textbox.Text = "Hello";

关于c# - 动态和不可变的 UIElement 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com