我有一个包含多个相同大小的Canvas
的WrapPanel
。 每个Canvas
都有一些UIElement
(即TextBox
、 TextBlock
、 Button
等)作为子项。 每个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]);
}
上面的代码很简单,工作正常 - 直到我在我可以的地方实现添加、减号和销毁按钮
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 个操作的某种组合,我可以轻松创建相同索引的 UIElements 或创建超出最初声明范围的 Canvas。
然而,我查看了List ,每个 Canvas 都有不同的属性(每个 Canvas 也有具有不同属性的 UIElement Children),我无法弄清楚 List 将如何解决它。 我的一种解决方法是为 Canvas 声明一个超大的数组大小(例如Canvas[] cv = new Canvas[99999]但我认为这不是很有效。
另外,如果我使用 List,如何在生成特定 UIElement 后更改它们的属性? 例如,如果我添加 10 个 Canvas 并添加到 List,并且在它们全部生成之后,我需要选择第 5 个 Canvas 并更改一个 TextBox.Text,我如何像在 Array 中那样访问它(即 tb[5].文本 = "你好")?
谁能告诉我一些解决这个问题的方法?
只是直接翻译如何使用下面的列表来做到这一点。 鉴于您的代码,我不知道您为什么要跟踪列表中的画布和文本框 - 您可以直接访问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);
}
编辑添加评论:
例如,如果我添加了 10 个 Canvas,并且在它们全部生成之后,我需要选择第 5 个 Canvas 并更改一个 TextBox.Text,我如何像在 Array 中那样访问它(即 tb[5].Text = "Hello ”)?
您可以直接访问孩子。 您知道您只向WrapPanel
添加了Canvas
元素。 所以你可以这样做(wp 又是WrapPanel
):
TextBox textbox = (wp.Children[5] as Canvas).Children[0] as TextBox;
textbox.Text = "Hello";
只需直接对WrapPanel
的 Children 集合进行操作。
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);
}
}
}