private void RemoveManager(IWpfTaskVisualizationManager manager)
 {
     manager.Dispose();
     lock (_visualizationManagers)
     {
         _visualizationManagers.Remove(manager);
     }
 }
        public UIElement CreateElement(Application app, Window window, params object[] parameters)
        {
            IWpfTaskVisualizationManager manager;
            UIElement showMoreIndicator = _showMoreFactory.CreateElement(app, window, parameters);

            lock (_visualizationManagers)
            {
                IWpfTaskVisualizationManager firstManager = _visualizationManagers.FirstAvailable();

                IEnumerable <ITaskObserver> activeTasks  = firstManager?.ActiveTasks;
                IEnumerable <ITaskObserver> pendingTasks = firstManager?.PendingTasks;

                manager = new TaskVisualizationManager(_maxElements, showMoreIndicator, SigmaEnvironment.TaskManager, activeTasks, pendingTasks);

                _visualizationManagers.Add(manager);
            }

            // When the window is closed, unassign the manager to prevent memory leaks.
            EventHandler handler = null;

            handler = (sender, args) =>
            {
                RemoveManager(manager);
                window.Closed -= handler;
            };

            window.Closed += handler;


            Grid grid = new Grid();

            // + 1 for the show more indicator
            for (int i = 0; i <= _maxElements; i++)
            {
                grid.ColumnDefinitions.Add(new ColumnDefinition {
                    Width = new GridLength(1, GridUnitType.Auto)
                });
            }

            // add the TaskVisualizers
            for (int i = 0; i < _maxElements; i++)
            {
                grid.Children.Add(manager.TaskVisualizers[i]);
                Grid.SetColumn(manager.TaskVisualizers[i], i);
            }

            // add the show more indicator
            grid.Children.Add(showMoreIndicator);
            Grid.SetColumn(showMoreIndicator, _maxElements);

            return(grid);
        }