System.InvalidOperationException: 'Элемент уже имеет логический
родительский элемент. Его необходимо отсоединить от старого родителя, прежде чем присоединить
к новому.'
Однако в этом нет смысла выдается в конце следующего метода, который представляет собой обработчик событий, который обновляет значок, отображаемый в NavigationItem (UserControl), инициируемый отдельным исполняемым потоком, который проверяет состояние соединения и запускает событие, если состояние соединения изменилось (т. е. был отключен -> теперь подключено, и наоборот).
Метод, в конце которого создается исключение:
Код: Выделить всё
void OnMachineConnectionStatusChangedHandler(object source, EventArgs e)
{
Dispatcher.Invoke(() =>
{
Machine machine = source as Machine;
// obtain the TreeViewItem representing this machine in the navigation tree
lock (_navigationTree)
{
foreach (TreeViewItem navigationItem in _navigationTree.Items)
{
NavigationItem machineNavItem = navigationItem.Header as NavigationItem;
if (machineNavItem.Machine.Equals(machine))
{
lock (machineNavItem)
{
machineNavItem.Refresh(); // changes shown icon
if (machine.Connected)
{
if (navigationItem.Items.Count > 0)
navigationItem.Items.Clear(); // clear prev. items shown under
TreeViewItem TO = new TreeViewItem()
{
Header = "TO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};
TreeViewItem WO = new TreeViewItem()
{
Header = "WO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};
TreeViewItem EWO = new TreeViewItem()
{
Header = "EWO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};
List machineHolds = machine.getActiveHoldNumbers();
if (machineHolds.Count > 1)
{
foreach (int hold in machineHolds)
{
TreeViewItem holdItem = new TreeViewItem() { Header = ("#" + hold) };
TO.Items.Add(hold);
WO.Items.Add(hold);
EWO.Items.Add(hold);
}
}
navigationItem.Items.Add(TO);
navigationItem.Items.Add(WO);
navigationItem.Items.Add(EWO);
navigationItem.IsExpanded = false;
}
}
}
}
}
this.UpdateLayout();
}); // here, the Exception is thrown
}
Для справки, вот структуру UserControl NavigationItem, если она имеет какое-либо значение:
Код: Выделить всё
public partial class NavigationItem : UserControl
{
// fields
private Machine _machine;
// properties
public Machine Machine
{
get { return _machine; }
}
public NavigationItem(Machine machine)
{
InitializeComponent();
_machine = machine;
if (_machine.Connected)
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Checkmark-Icon.png"));
else
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/X-Icon.png"));
_machineNameLabel.Content = _machine.Name;
}
public void Refresh()
{
if (_machine.Connected)
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Checkmark-Icon.png"));
else
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/X-Icon.png"));
}
}
Подробнее здесь: https://stackoverflow.com/questions/632 ... en-when-co