2

我有一个WrapPanel包含多个Canvas相同大小的。每个Canvas都有一些UIElements(即TextBox, TextBlock, Buttons 等)作为孩子。每个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 个画布并添加到列表中,并且在它们全部生成之后,我需要选择第 5 个画布并更改一个 TextBox.Text,我如何像在数组中那样访问它(即 tb[5].文本=“你好”)?

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

4

2 回答 2

3

只是直接翻译如何使用下面的列表来执行此操作。鉴于您的代码,我不知道您为什么要跟踪列表中的画布和文本框 - 您可以直接访问子集合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,我如何像在数组中那样访问它(即 tb[5].Text = "Hello “)?

您可以直接访问孩子。你知道你只是Canvas在你的WrapPanel. 所以你可以这样做(wp 是WrapPanel再次):

TextBox textbox = (wp.Children[5] as Canvas).Children[0] as TextBox;
textbox.Text = "Hello";
于 2011-04-04T02:53:15.600 回答
1

只需直接对WrapPanel's 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);
    }


}
}
于 2011-04-04T02:56:20.213 回答