internal static FrameworkObject GetContainingFrameworkElement(DependencyObject current)
        {
            var fo = new FrameworkObject(current);

            while (!fo.IsValid && fo.DependencyObject != null)
            {
                // The current object is neither a FrameworkElement nor a
                // FrameworkContentElement.  We will now walk the "core"
                // tree looking for one.
                Visual         visual;
                Visual3D       visual3D;
                ContentElement ce;

                if ((visual = fo.DependencyObject as Visual) != null)
                {
                    fo.Reset(VisualTreeHelper.GetParent(visual));
                }
                else if ((ce = fo.DependencyObject as ContentElement) != null)
                {
                    fo.Reset(ContentOperations.GetParent(ce));
                }
                else if ((visual3D = fo.DependencyObject as Visual3D) != null)
                {
                    fo.Reset(VisualTreeHelper.GetParent(visual3D));
                }
                else
                {
                    // The parent could be an application.
                    fo.Reset(null);
                }
            }

            return(fo);
        }
        //// internal bool ThisHasLoadedChangeEventHandler
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.ThisHasLoadedChangeEventHandler;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.ThisHasLoadedChangeEventHandler;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        //// }

        //// internal bool SubtreeHasLoadedChangeHandler
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.SubtreeHasLoadedChangeHandler;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.SubtreeHasLoadedChangeHandler;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.SubtreeHasLoadedChangeHandler = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.SubtreeHasLoadedChangeHandler = value;
        ////        }
        ////    }
        //// }

        //// internal InheritanceBehavior InheritanceBehavior
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.InheritanceBehavior;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.InheritanceBehavior;
        ////        }
        ////        else
        ////        {
        ////            return InheritanceBehavior.Default;
        ////        }
        ////    }
        //// }

        //// internal bool StoresParentTemplateValues
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.StoresParentTemplateValues;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.StoresParentTemplateValues;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.StoresParentTemplateValues = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.StoresParentTemplateValues = value;
        ////        }
        ////    }
        //// }

        //// internal bool HasResourceReference
        //// {
        ////    /* not used (yet)
        ////    get
        ////    {
        ////        if (IsFE)
        ////        {
        ////            return _fe.HasResourceReference;
        ////        }
        ////        else if (IsFCE)
        ////        {
        ////            return _fce.HasResourceReference;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    */
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.HasResourceReference = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.HasResourceReference = value;
        ////        }
        ////    }
        //// }

        /* not used (yet)
         * internal bool HasStyleChanged
         * {
         *  get
         *  {
         *      if (IsFE)
         *      {
         *          return _fe.HasStyleChanged;
         *      }
         *      else if (IsFCE)
         *      {
         *          return _fce.HasStyleChanged;
         *      }
         *      else
         *      {
         *          return false;
         *      }
         *  }
         *  set
         *  {
         *      if (IsFE)
         *      {
         *          _fe.HasStyleChanged = value;
         *      }
         *      else if (IsFCE)
         *      {
         *          _fce.HasStyleChanged = value;
         *      }
         *  }
         * }
         */

        //// internal bool HasTemplateChanged
        //// {
        ////    /* not used (yet)
        ////    get
        ////    {
        ////        if (IsFE)
        ////        {
        ////            return _fe.HasTemplateChanged;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    */
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.HasTemplateChanged = value;
        ////        }
        ////    }
        //// }

        //// Says if there are any implicit styles in the ancestry
        //// internal bool ShouldLookupImplicitStyles
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.ShouldLookupImplicitStyles;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.ShouldLookupImplicitStyles;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.ShouldLookupImplicitStyles = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.ShouldLookupImplicitStyles = value;
        ////        }
        ////    }
        //// }

        internal static bool IsEffectiveAncestor(DependencyObject d1, DependencyObject d2)
        {
            for (var fo = new FrameworkObject(d2);
                 fo.DependencyObject != null;
                 fo.Reset(fo.EffectiveParent))
            {
                if (ReferenceEquals(fo.DependencyObject, d1))
                {
                    return(true);
                }
            }

            return(false);
        }
        internal static FrameworkObject GetContainingFrameworkElement(DependencyObject current)
        {
            FrameworkObject fo = new FrameworkObject(current);

            while (!fo.IsValid && fo.DependencyObject != null)
            {
                // The current object is neither a FrameworkElement nor a
                // FrameworkContentElement.  We will now walk the "core"
                // tree looking for one.
                Visual visual;
                Visual3D visual3D;
                ContentElement ce;

                if ((visual = fo.DependencyObject as Visual) != null)
                {
                    fo.Reset(VisualTreeHelper.GetParent(visual));
                }
                else if ((ce = fo.DependencyObject as ContentElement) != null)
                {
                    fo.Reset(ContentOperations.GetParent(ce));
                }
                else if ((visual3D = fo.DependencyObject as Visual3D) != null)
                {
                    fo.Reset(VisualTreeHelper.GetParent(visual3D));
                }
                else
                {
                    // The parent could be an application.
                    fo.Reset(null);
                }
            }

            return fo;
        }
        //// internal bool ThisHasLoadedChangeEventHandler
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.ThisHasLoadedChangeEventHandler;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.ThisHasLoadedChangeEventHandler;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        //// }

        //// internal bool SubtreeHasLoadedChangeHandler
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.SubtreeHasLoadedChangeHandler;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.SubtreeHasLoadedChangeHandler;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.SubtreeHasLoadedChangeHandler = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.SubtreeHasLoadedChangeHandler = value;
        ////        }
        ////    }
        //// }

        //// internal InheritanceBehavior InheritanceBehavior
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.InheritanceBehavior;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.InheritanceBehavior;
        ////        }
        ////        else
        ////        {
        ////            return InheritanceBehavior.Default;
        ////        }
        ////    }
        //// }

        //// internal bool StoresParentTemplateValues
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.StoresParentTemplateValues;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.StoresParentTemplateValues;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.StoresParentTemplateValues = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.StoresParentTemplateValues = value;
        ////        }
        ////    }
        //// }

        //// internal bool HasResourceReference
        //// {
        ////    /* not used (yet)
        ////    get
        ////    {
        ////        if (IsFE)
        ////        {
        ////            return _fe.HasResourceReference;
        ////        }
        ////        else if (IsFCE)
        ////        {
        ////            return _fce.HasResourceReference;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    */
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.HasResourceReference = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.HasResourceReference = value;
        ////        }
        ////    }
        //// }

        /* not used (yet)
        internal bool HasStyleChanged
        {
            get
            {
                if (IsFE)
                {
                    return _fe.HasStyleChanged;
                }
                else if (IsFCE)
                {
                    return _fce.HasStyleChanged;
                }
                else
                {
                    return false;
                }
            }
            set
            {
                if (IsFE)
                {
                    _fe.HasStyleChanged = value;
                }
                else if (IsFCE)
                {
                    _fce.HasStyleChanged = value;
                }
            }
        }
        */

        //// internal bool HasTemplateChanged
        //// {
        ////    /* not used (yet)
        ////    get
        ////    {
        ////        if (IsFE)
        ////        {
        ////            return _fe.HasTemplateChanged;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    */
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.HasTemplateChanged = value;
        ////        }
        ////    }
        //// }

        //// Says if there are any implicit styles in the ancestry
        //// internal bool ShouldLookupImplicitStyles
        //// {
        ////    get
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            return this._fe.ShouldLookupImplicitStyles;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            return this._fce.ShouldLookupImplicitStyles;
        ////        }
        ////        else
        ////        {
        ////            return false;
        ////        }
        ////    }
        ////    set
        ////    {
        ////        if (this.IsFE)
        ////        {
        ////            this._fe.ShouldLookupImplicitStyles = value;
        ////        }
        ////        else if (this.IsFCE)
        ////        {
        ////            this._fce.ShouldLookupImplicitStyles = value;
        ////        }
        ////    }
        //// }

        internal static bool IsEffectiveAncestor(DependencyObject d1, DependencyObject d2)
        {
            for (FrameworkObject fo = new FrameworkObject(d2);
                fo.DependencyObject != null;
                fo.Reset(fo.EffectiveParent))
            {
                if (ReferenceEquals(fo.DependencyObject, d1))
                {
                    return true;
                }
            }

            return false;
        }