Событие 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
}
}
}