Ошибка дерева WPF при переходе на предыдущую вкладку - PullRequest
0 голосов
/ 19 октября 2010

Так что для моего приложения я просто загрузил изображение, а затем в сетке в элементе вкладки.После нажатия на кнопку я создаю новый элемент вкладки со связанным кодом для загрузки других вещей.Однако, возвращаясь к первой вкладке, я сталкиваюсь с этой ошибкой:

"Необходимо отключить указанный дочерний элемент от текущего родительского Visual перед подключением к новому родительскому 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) -> listboxitems ...

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Событие Loaded вызывается каждый раз, когда вы выбираете вкладку, пытаясь снова добавить _square!

Событие Loaded не обязательно вызывается только один раз при первой загрузке - элемент потенциально может быть снова загружен, например, если вы использовали системные темы и изменили системную тему, все визуальные элементы перезагружаются. В вашем случае визуальное дерево как-то снова становится недействительным - возможно, потому что ваша привязка к изображению читается снова (если это причина, то может быть хорошей идеей также изменить привязку к OneTime) Более подробная информация здесь: http://msdn.microsoft.com/en-us/library/ms754221.aspx и здесь: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx

ОБНОВЛЕНИЕ: Из комментария во 2-й ссылке выше, применимо в вашем случае:

"Если я могу добавить, Loaded Event также возникает, когда когда-либо загружается и выгружается элемент пользовательского интерфейса. Такой случай будет, если у вас есть кнопка с именем" x "на вкладке" A ", когда пользователь переключается на вкладку «B» событие UnLoaded вызывается для x. Когда пользователь переключается обратно на вкладку A, событие Loaded вызывается для x, но не инициализируется… »

Вы должны быть в состоянии подтвердить, если это действительно так с точкой останова во время отладки. Если это так: вы можете использовать флаг, чтобы событие ничего не делало или удалить событие после его запуска:

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
    }
  }
}
0 голосов
/ 19 октября 2010

Или, если вы используете элементы управления KM (свою сетку?), Вам может потребоваться обновить: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/321f9721-ca38-41ca-b851-7667895d6d84

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...