private void OnStartClick(object sender, RoutedEventArgs e)
        {
            EndAllTools();
            buttonStart.IsEnabled = false;

            World world = GetWorld();

            computation = new TrailsComputation(world);
            computation.ProgressChanged += (_s, _e) => Dispatcher.Invoke(
                () => {
                if (computation != null)
                {
                    textBoxComputationStage.Text = computation.CurrentStage;
                }
            }
                );
            computation.CanGiveUnripeResult            += (_s, _e) => Dispatcher.Invoke(
                () => buttonGiveUnripeResult.Visibility = Visibility.Visible
                );

            computationThread = new Thread(() =>
            {
                try
                {
                    Dispatcher.Invoke(ShowComputationsIsOnGrid);
                    TrailsComputationsOutput output = computation.Run();
                    trampledness   = new Trampledness(output.Graph);
                    unsavedChanges = true;
                    Dispatcher.Invoke(DrawTrampledness);
                }
                catch (IsolatedAttractorsException)
                {
                    MessageBox.Show("Обнаружены изолированные точки", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                catch (ThreadAbortException)
                {
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                finally
                {
                    Dispatcher.Invoke(() => {
                        gridComputationIsOn.Visibility = Visibility.Collapsed;
                        buttonStart.IsEnabled          = true;
                    });
                    computation       = null;
                    computationThread = null;
                }
            });
            computationThread.IsBackground = true;
            computationThread.Start();
        }
        private void LoadFromSaveFile(SaveFile saveFile)
        {
            ClearAll();

            boundingAreaTool.BoundingArea = saveFile.World.BoundingArea;
            mapObjectLayer.AddRange(saveFile.World.MapObjects);
            attractorLayer.AddRange(saveFile.World.AttractorObjects);

            this.trampledness = saveFile.Trampledness;
            DrawTrampledness();
            checkBoxShowTrampledness.IsChecked = true;

            mapControl.ZoomToBox(saveFile.Viewport.TopLeft, saveFile.Viewport.BottomRight);

            RefreshLayers();
            RefreshButtons();

            unsavedChanges = false;
        }
 private void ClearTrampledness()
 {
     trampledness = null;
     edgeLayer.Clear();
 }