private void AddAdornerInfo(IDictionary infoMap, AdornerInfo adornerInfo, object key) { ArrayList adornerInfos; if (infoMap[key] == null) { adornerInfos = new ArrayList(1); infoMap[key] = adornerInfos; } else { adornerInfos = (ArrayList)infoMap[key]; } adornerInfos.Add(adornerInfo); }
/// <summary> /// Clean all the dynamically-updated data from the Adorner /// </summary> /// <param name="adornerInfo">AdornerInfo to scrub</param> internal void InvalidateAdorner(AdornerInfo adornerInfo) { Debug.Assert(adornerInfo != null, "Adorner should not be null"); adornerInfo.Adorner.InvalidateMeasure(); adornerInfo.Adorner.InvalidateVisual(); adornerInfo.RenderSize = new Size(Double.NaN, Double.NaN); adornerInfo.Transform = null; }
//------------------------------------------------------ // // Internal Events // //----------------------------------------------------- //------------------------------------------------------ // // Private Methods // //----------------------------------------------------- #region Private Methods /// <summary> /// Adds the given adorner to the visual tree in the proper zOrder order. /// </summary> /// <param name="adornerInfo"></param> /// <param name="zOrder"></param> private void AddAdornerToVisualTree(AdornerInfo adornerInfo, int zOrder) { Adorner adorner = adornerInfo.Adorner; Debug.Assert(adorner != null); AddAdornerInfo(_zOrderMap, adornerInfo, zOrder); // We've already added the adorner to the zOrderMap, so we can't get null back ArrayList adornerInfos = (ArrayList)_zOrderMap[zOrder]; if (adornerInfos.Count > 1) { // The easy case. Find the index of the adorner immediately in front of the // new one and insert the new one after it. int index = adornerInfos.IndexOf(adornerInfo); int insertionIndex = _children.IndexOf(((AdornerInfo)adornerInfos[index - 1]).Adorner) + 1; _children.Insert(insertionIndex, adorner); } else { // The hard case. Find the set of adorners with the closest, but lower, zOrder. IList keys = _zOrderMap.GetKeyList(); int index = keys.IndexOf(zOrder) - 1; if (index < 0) { // nothing's lower than the new adorner. Make it the first child. _children.Insert(0, adorner); } else { // find the last adorner at this zOrder and add the new one after it. adornerInfos = (ArrayList)_zOrderMap[keys[index]]; int insertionIndex = _children.IndexOf(((AdornerInfo)adornerInfos[adornerInfos.Count - 1]).Adorner) + 1; _children.Insert(insertionIndex, adorner); } } }
//----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods /// <summary> /// Add given Adorner to our children /// </summary> /// <param name="adorner">Adorner to add</param> /// <param name="zOrder">z-order</param> internal void Add(Adorner adorner, int zOrder) { if (adorner == null) throw new ArgumentNullException("adorner"); AdornerInfo adornerInfo = new AdornerInfo(adorner); adornerInfo.ZOrder = zOrder; AddAdornerInfo(ElementMap, adornerInfo, adorner.AdornedElement); AddAdornerToVisualTree(adornerInfo, zOrder); AddLogicalChild(adorner); UpdateAdorner(adorner.AdornedElement); }