导航回以前的选项卡时出现WPF树错误

时间:2010-10-19 04:25:59

标签: wpf

因此,对于我的应用程序,我只加载了一个图像,然后在标签项中的网格中。单击按钮后,我创建一个新的选项卡项,其中包含相关代码以加载其他内容。但是,在返回第一个标签时,我遇到了这个错误:

“在连接到新的父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 ...

2 个答案:

答案 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