因此,对于我的应用程序,我只加载了一个图像,然后在标签项中的网格中。单击按钮后,我创建一个新的选项卡项,其中包含相关代码以加载其他内容。但是,在返回第一个标签时,我遇到了这个错误:
“在连接到新的父Visual之前,必须断开指定的子视图与当前父视图的连接。”
具体来说:
public class VisualsHost : FrameworkElement
{
DrawingVisual _square;
public VisualsHost()
{
_square = new DrawingVisual();
this.Loaded += new RoutedEventHandler(OnLoaded);
}
public void OnLoaded(object sender, RoutedEventArgs e)
{
AddVisualChild(_square);
AddLogicalChild(_square);
}
这只是我在主要标签中用于我的内容的选区的容器。
所以我想知道,这里究竟发生了什么,我将如何解决这个问题?
我的第一个标签中的内容的简要结构是:
的tabcontrol> dockpanel - > listbox - > grid(itemspanelcontainer style) - > listboxitems ...
答案 0 :(得分:1)
每次选择标签时都会调用Loaded事件,从而尝试再次添加_square!
Loaded事件不一定只在第一次加载时调用一次 - 该元素可能会再次加载,例如,如果您使用系统主题并更改了系统主题,则重新加载所有可视元素。在您的情况下,可视化树以某种方式再次失效 - 也许是因为你再次读取了对Image的绑定(如果这是因为将你的绑定更改为OneTime也是个好主意)。这里有更多信息:http://msdn.microsoft.com/en-us/library/ms754221.aspx和此处:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx
更新:根据上述第二个链接中的评论,适用于您的情况:
“如果我加载和卸载UI元素时也会引发加载事件。如果你在用户切换到Tab时在标签'A'中有一个名为'x'的按钮,就会出现这种情况。 'B'为x引发了一个UnLoaded事件。当用户切换回选项卡A时,会为x引发一个Loaded事件,但不会引发Initialized事件......“
在调试时,您应该能够确认断点是否确实如此。如果是:您可以使用标志来阻止事件执行任何操作或在事件运行后删除事件:
public class VisualsHost : FrameworkElement
{
bool hasLoaded = false;
DrawingVisual _square;
public VisualsHost()
{
_square = new DrawingVisual();
this.Loaded += new RoutedEventHandler(OnLoaded);
}
public void OnLoaded(object sender, RoutedEventArgs e)
{
if(!hasLoaded)
{
AddVisualChild(this._square);
AddLogicalChild(this._square);
this.hasLoaded = true;
this.Loaded -= OnLoaded; // unnecessary if using the hasLoaded flag
}
}
}
答案 1 :(得分:0)
或者,如果您使用KM控件(您的网格?),您可能需要升级:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/321f9721-ca38-41ca-b851-7667895d6d84