网格不记得动态添加的元素

时间:2012-09-23 22:30:41

标签: c# windows-phone-7 xaml invalidoperationexception

我正在尝试使用在后面的代码中添加的Web浏览器项目在我的MainPage中填充网格。出于某种原因,我无法让网格记住已经添加了哪些元素。我不确定如何存储此信息,以便当MainPage导航,然后返回时,网格知道先前添加了哪些值。为了更好地解释,我所拥有的内容如下:

MainPage.xaml中

<Grid x:Name="BrowserHost" Grid.Row="1">
    //Items will be added in code behind
</Grid>

MainPage.xaml.cs中

private void ShowTab(int index) 
    {
        this.currentIndex = index;
        int count = Settings.BrowserList.Value.Count;

        if (count <= 0)
        {                
            MessageBox.Show("count <= 0");
        }
        if (currentIndex <= (count - 1))  //in correct range
        {
            // BrowserHost does not remember previously added children elements added previously when navigated back to this page and performing this check
            if(!BrowserHost.Children.Contains(Settings.BrowserList.Value[currentIndex].Browser))
                //Attempt to add browser if it was already added previously throws InvalidOperationException
                BrowserHost.Children.Add(Settings.BrowserList.Value[currentIndex].Browser);
        }

        if (currentIndex > (count - 1))
        {
            MessageBox.Show("currentIndex > (count - 1)");
        }

        for (int i = 0; i < Settings.BrowserList.Value.Count; i++)
        {
            if (Settings.BrowserList.Value.ElementAt(i) != null)
            {
                Settings.BrowserList.Value.ElementAt(i).Browser.Visibility = i == this.currentIndex ? Visibility.Visible : Visibility.Collapsed;
            }
        }
    }

基本上,每次MainPage加载时,都会使用特定的索引值调用ShowTab方法。执行检查以查看列表中的currentIndex是否存在Settings.BrowserList.Value[currentIndex].Browser(具有Web浏览器实例的集合)(这些是在另一页中添加的)。如果MainPage上的BrowserHost网格已经包含具有特定索引的子元素(浏览器),那么它应该跳过检查并继续在屏幕上显示该浏览器实例。这应该基本上为我创建的自定义Web浏览器控件实现选项卡式浏览方案。我的问题是,我可以连续添加新浏览器到BrowserHost并在屏幕上显示它们,但是当我尝试在我的集合中的某个索引处调用以前添加的webbrowser时,我得到一个InvalidOperationException。我该如何解决这个问题?我的调试显示在ShowTab中,当我检查是否添加了浏览器时,无论它是否有,它都会跳转到尝试将该浏览器添加到BrowserHost子元素。如果之前已经创建了浏览器,则会发生InvalidOperationException。

1 个答案:

答案 0 :(得分:0)

我不认为你在做什么是个好主意。但是,问题似乎是控件已经被不同的控件作为父级,因此您无法再次添加它。尝试执行以下操作:

var browser = Settings.BrowserList.Value[currentIndex].Browser;
if(!BrowserHost.Children.Contains(browser))
{

  var grid = (Grid)browser.Parent;
  if (grid != null)
  {
    grid.Children.Remove(browser);
  }
  BrowserHost.Children.Add(browser);
}

您还需要确保浏览器以其他形式放置在网格中(如果它不直接放在网格中,只需将其包装在一个网格中)。

这可能有用,但我强烈建议你找到一种不同的方法。