我正在尝试在我的 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(这些被添加到另一个页面中)。如果BrowserHost
MainPage 上的网格已经包含具有特定索引的子元素(浏览器),那么它应该跳过检查并继续在屏幕上显示该浏览器实例。这应该基本上为我创建的自定义 Web 浏览器控件实现选项卡式浏览场景。我的问题是,我可以连续添加新的浏览器BrowserHost
并将它们显示在屏幕上,但是当我尝试在我的集合中的某个索引处调用以前添加的网络浏览器时,我得到一个 InvalidOperationException。我将如何解决这个问题?我的调试表明,ShowTab
当我检查是否已添加浏览器时,无论是否添加,它都会尝试将该浏览器添加到BrowserHost
子元素。如果之前已经创建了浏览器,那就是 InvalidOperationException 发生的时候。