元素已经是另一个元素的孩子 - WinRT

时间:2015-05-11 07:41:55

标签: c# windows-runtime windows-store-apps

我需要开发一个类似于Windows 8 Start屏幕的结构。我有一个方法,我打电话来填充我的RecordTile。方法就像,

public static void fnShowTiles(List<RecordTile> objList, Grid objGrid) // objGrid is root Grid which holds this structure
    {
        try
        {
            // copy the list into local variable
            List<RecordTile> objListOfTiles = objList.ToList<RecordTile>();

            int nColumnsCount = -1;
            objGrid.Children.Clear();
            objGrid.ColumnDefinitions.Clear();
            StackPanel objPanel = new StackPanel();

            int nOriginalListCount = objListOfTiles.Count;
            int nRowsToRender = 4;

            while (objListOfTiles.Count > 0)
            {
                // add new column to the grid
                objGrid.ColumnDefinitions.Add(new ColumnDefinition());
                nColumnsCount += 1;

                // add new stackpanel to newly added column
                objPanel = new StackPanel();

                objGrid.Children.Add(objPanel);
                Grid.SetColumn(objPanel, nColumnsCount);

                // add elements to stackpanel
                int i = 0;
                while (i < nRowsToRender)
                {
                    if (objListOfTiles.Count > 0)
                    {
                        // add first element and remove it from list, so that next element will be first
                        RecordTile tile = objListOfTiles.First();
                        objPanel.Children.Add(tile); // exception occurs here
                        objListOfTiles.Remove(tile);
                        i++;
                    }
                    else
                    {
                        // if while adding elements, list finishes, then break the loop
                        break;
                    }
                }
            }
    }

这适用于第一次加载。我在同一页面上有一个SearchBox来加载这些图块。当我过滤Tiles(基于搜索字符串)并将新的tile列表传递给函数时,它会抛出异常。

我经历了很多帖子。他们建议从父母那里删除元素。我每次都要清理网格的孩子们。什么一定出错?

2 个答案:

答案 0 :(得分:0)

正如@Rawling建议的那样,在StackPanel之前从objGrid.Children.Clear();清除Tiles是解决方案。在该声明之前添加了以下代码,它就像魅力一样。

foreach (StackPanel panel in objGrid.Children)
{
    panel.Children.Clear();
}

答案 1 :(得分:0)

错误很明显:WPF / SL控件一次只能属于1个父控件。也可以尝试。

/login.aspx