protected virtual List <ILifeCycle> NotifyParentVisibilityAndReturnNotLoadedControl(object node, bool isVisible) { var controlBase = node as ControlBaseViewModel; Queue <ControlBaseViewModel> queue = new Queue <ControlBaseViewModel>(); List <ILifeCycle> controls = new List <ILifeCycle>(); //preload the children of the root control. foreach (var child in controlBase.GetControlsIterator()) { queue.Enqueue(child); } while (queue.Count > 0) { ControlBaseViewModel current = queue.Dequeue(); if (current == null) { continue; } if (current.VisibleState.HasFlag(VisibleState.Visible)) { foreach (var child in current.GetControlsIterator()) { queue.Enqueue(child); } } bool currVisibility = current.Visible; if (isVisible) { current.VisibleState |= VisibleState.ParentVisible; if (current.Visible && !current.Loaded) { controls.Add(current); } } else { current.VisibleState &= ~VisibleState.ParentVisible; } if (ViewManager != null && currVisibility != current.Visible) { ViewManager.Events.PublishOrEnqueueEvent("VISIBLECHANGED", current, current, System.EventArgs.Empty); } } return(controls); }
/// <summary> /// This is a modified breath first search algorithm to fit with our necessity. /// </summary> public virtual void NotifyParentVisibility(object node, bool isVisible) { var controlBase = node as ControlBaseViewModel; Queue <ControlBaseViewModel> queue = new Queue <ControlBaseViewModel>(); //preload the children of the root control. foreach (var child in controlBase.GetControlsIterator()) { queue.Enqueue(child); } while (queue.Count > 0) { ControlBaseViewModel current = queue.Dequeue(); if (current == null) { continue; } if (!isVisible || current.VisibleState.HasFlag(VisibleState.Visible)) { foreach (var child in current.GetControlsIterator()) { queue.Enqueue(child); } } bool currVisibility = current.Visible; if (isVisible) { current.VisibleState |= VisibleState.ParentVisible; } else { current.VisibleState &= ~VisibleState.ParentVisible; } if (ViewManager != null && currVisibility != current.Visible) { ViewManager.Events.PublishOrEnqueueEvent("VISIBLECHANGED", current, current, System.EventArgs.Empty); } } }