我正在尝试使用在后面的代码中添加的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。
答案 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);
}
您还需要确保浏览器以其他形式放置在网格中(如果它不直接放在网格中,只需将其包装在一个网格中)。
这可能有用,但我强烈建议你找到一种不同的方法。