Я думаю, вам нужно немного переосмыслить свой дизайн.Я полагаю, карта является элементом управления TreeView?Тогда вам не нужно использовать BeginInvoke для вызова его методов.Все, что нужно, это отправить вызов в очередь и задержать операцию.Пока все в потоке пользовательского интерфейса, вам не нужно это делать.
Имейте в виду, что вызов Refresh заставит представление дерева перерисовать все дерево и ВСЕ его узлы.Это большая работа для каждого изменения узла и может не потребоваться, если вы не вызываете никаких изменений.Я также не знаком с FindFeatureLayer, поэтому не знаю, насколько эффективно он работает.
Наконец, в документации Microsoft есть примечание об установке свойства Node.Checked в событии AfterCheck.
Setting the TreeNode.Checked property from within the BeforeCheck or AfterCheck event
causes the event to be raised multiple times and can result in unexpected behavior. For
example, you might set the Checked property in the event handler when you are
recursively updating the child nodes so that the user does not have to expand and check
each one individually. To prevent the event from being raised multiple times, add logic
to your event handler that only executes your recursive code if the Action property of
the TreeViewEventArgs is not set to TreeViewAction.Unknown. For an example of how to do
this, see the Example section of the AfterCheck or BeforeCheck events.
так, может быть, это было бы лучше ???
if(e.Action != TreeViewAction.Unknown)
{
if (e.Node.Parent == null) //if it's a parent node, make any children nodes match its checked state
{
foreach (TreeNode node in e.Node.Nodes)
{
node.Checked = e.Node.Checked;
Map.FindFeatureLayer(node.Name).IsVisible = node.Checked;
}
}
else //it's a child node
{
Map.FindFeatureLayer(e.Node.Name).IsVisible = e.Node.Checked;
}
//Map.Refresh(); // You may not need this if everything is immediate
}
надеюсь, это поможет, я не могу полностью проверить в настоящее время.