1

我正在尝试在我的 MainPage 中使用添加在后面代码中的 Web 浏览器项填充网格。出于某种原因,我无法让网格记住已经添加了哪些元素。我不确定如何存储此信息,以便在从 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;
            }
        }
    }

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

4

1 回答 1

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

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

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

于 2012-09-24T22:23:13.567 回答