Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / LogicalTreeHelper.cs / 1305600 / LogicalTreeHelper.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: The LogicalTreeHelper class contains static methods that are // useful for performing common tasks with logical tree nodes. There's nothing // here that the end user can't do themselves - but we do it for them and // gather them up here. // // History: // 07/28/2003 : RogerCh - Initial creation // //--------------------------------------------------------------------------- using System; using System.Collections; // In order to use IEnumerator using System.Diagnostics; using MS.Utility; // In order to use SR.Get and SRID namespace System.Windows { /* public delegate bool ParentTraversalCallback(FrameworkElement parentFE, FrameworkContentElement parentFCE, object data); public delegate bool ChildTraversalCallback(FrameworkElement childFE, FrameworkContentElement childFCE, object child, object data); */ ////// Static helper functions for dealing with the logical tree /// public static class LogicalTreeHelper { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- //------------------------------------------------------ // // Public Properties // //----------------------------------------------------- // None //------------------------------------------------------ // // Public Methods // //------------------------------------------------------ #region Public Methods ////// Given an element in the logical tree to start searching from, /// searches all its descendent nodes in the logical tree a node whose Name /// matches the specified elementName. /// The given DependencyObject must be either a FrameworkElement or FrameworkContentElement. /// ////// We're searching in a depth-first manner. Review this if this turns out /// to be a performance problem. We're doing this first because it's easy /// and light on memory usage as compared to breadth-first. /// (RogerCh):It would be cool if the DFID (depth-first iterative-deepening) /// algorithm would be useful here. /// public static DependencyObject FindLogicalNode( DependencyObject logicalTreeNode, string elementName ) { if( logicalTreeNode == null ) { throw new ArgumentNullException("logicalTreeNode"); } if( elementName == null ) { throw new ArgumentNullException("elementName"); } if( elementName == String.Empty ) { throw new ArgumentException(SR.Get(SRID.StringEmpty), "elementName"); } DependencyObject namedElement = null; DependencyObject childNode = null; // Check given node against named element. IFrameworkInputElement selfNode = logicalTreeNode as IFrameworkInputElement; if( selfNode != null ) { if( selfNode.Name == elementName ) { namedElement = logicalTreeNode; } } if( namedElement == null ) { // Nope, the given node isn't it. See if we can check children. IEnumerator childEnumerator = null; childEnumerator = LogicalTreeHelper.GetLogicalChildren(logicalTreeNode); // If we can enumerate, check the children. if( childEnumerator != null ) { childEnumerator.Reset(); while( namedElement == null && childEnumerator.MoveNext() == true) { childNode = childEnumerator.Current as DependencyObject; if( childNode != null ) { namedElement = FindLogicalNode( childNode, elementName ); } } } } // Return what we can find - may be null. return namedElement; } ////// Get the logical parent of the given DependencyObject. /// The given DependencyObject must be either a FrameworkElement or FrameworkContentElement /// to have a logical parent. /// public static DependencyObject GetParent(DependencyObject current) { if (current == null) { throw new ArgumentNullException("current"); } FrameworkElement fe = current as FrameworkElement; if (fe != null) { return fe.Parent; } FrameworkContentElement fce = current as FrameworkContentElement; if (fce != null) { return fce.Parent; } return null; } ////// Get the logical children for the given DependencyObject. /// The given DependencyObject must be either a FrameworkElement or FrameworkContentElement /// to have logical children. /// public static IEnumerable GetChildren(DependencyObject current) { if (current == null) { throw new ArgumentNullException("current"); } FrameworkElement fe = current as FrameworkElement; if (fe != null) { return new EnumeratorWrapper(fe.LogicalChildren); } FrameworkContentElement fce = current as FrameworkContentElement; if (fce != null) { return new EnumeratorWrapper(fce.LogicalChildren); } return EnumeratorWrapper.Empty; } ////// Get the logical children for the given FrameworkElement /// public static IEnumerable GetChildren(FrameworkElement current) { if (current == null) { throw new ArgumentNullException("current"); } return new EnumeratorWrapper(current.LogicalChildren); } ////// Get the logical children for the given FrameworkContentElement /// public static IEnumerable GetChildren(FrameworkContentElement current) { if (current == null) { throw new ArgumentNullException("current"); } return new EnumeratorWrapper(current.LogicalChildren); } ////// Attempts to bring this element into view by originating a RequestBringIntoView event. /// public static void BringIntoView(DependencyObject current) { if (current == null) { throw new ArgumentNullException("current"); } FrameworkElement fe = current as FrameworkElement; if (fe != null) { fe.BringIntoView(); } FrameworkContentElement fce = current as FrameworkContentElement; if (fce != null) { fce.BringIntoView(); } } /* ///// */ #endregion Public Methods //----------------------------------------------------- // // Public Events // //------------------------------------------------------ // None //----------------------------------------------------- // // Internal Constructors // //----------------------------------------------------- // None //----------------------------------------------------- // // Internal Properties // //------------------------------------------------------ // None //----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods internal static void AddLogicalChild(DependencyObject parent, object child) { if (child != null && parent != null) { FrameworkElement parentFE = parent as FrameworkElement; if (parentFE != null) { parentFE.AddLogicalChild(child); } else { FrameworkContentElement parentFCE = parent as FrameworkContentElement; if (parentFCE != null) { parentFCE.AddLogicalChild(child); } } } } internal static void AddLogicalChild(FrameworkElement parentFE, FrameworkContentElement parentFCE, object child) { if (child != null) { if (parentFE != null) { parentFE.AddLogicalChild(child); } else if (parentFCE != null) { parentFCE.AddLogicalChild(child); } } } internal static void RemoveLogicalChild(DependencyObject parent, object child) { if (child != null && parent != null) { FrameworkElement parentFE = parent as FrameworkElement; if (parentFE != null) { parentFE.RemoveLogicalChild(child); } else { FrameworkContentElement parentFCE = parent as FrameworkContentElement; if (parentFCE != null) { parentFCE.RemoveLogicalChild(child); } } } } internal static void RemoveLogicalChild(FrameworkElement parentFE, FrameworkContentElement parentFCE, object child) { if (child != null) { Debug.Assert(parentFE != null || parentFCE != null, "Either parentFE or parentFCE should be non-null"); if (parentFE != null) { parentFE.RemoveLogicalChild(child); } else { parentFCE.RemoveLogicalChild(child); } } } internal static IEnumerator GetLogicalChildren(DependencyObject current) { FrameworkElement fe = current as FrameworkElement; if (fe != null) { return fe.LogicalChildren; } FrameworkContentElement fce = current as FrameworkContentElement; if (fce != null) { return fce.LogicalChildren; } return MS.Internal.Controls.EmptyEnumerator.Instance; } #endregion Internal Methods //------------------------------------------------------ // // Internal Events // //----------------------------------------------------- // None //------------------------------------------------------ // // Private Classes // //----------------------------------------------------- private class EnumeratorWrapper : IEnumerable { public EnumeratorWrapper(IEnumerator enumerator) { if (enumerator != null) { _enumerator = enumerator; } else { _enumerator = MS.Internal.Controls.EmptyEnumerator.Instance; } } IEnumerator IEnumerable.GetEnumerator() { return _enumerator; } IEnumerator _enumerator; internal static EnumeratorWrapper Empty { get { if (_emptyInstance == null) { _emptyInstance = new EnumeratorWrapper(null); } return _emptyInstance; } } static EnumeratorWrapper _emptyInstance; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IndexingContentUnit.cs
- ApplicationFileParser.cs
- BuildProvidersCompiler.cs
- ComponentDispatcherThread.cs
- WrappedIUnknown.cs
- Imaging.cs
- ListBoxItemWrapperAutomationPeer.cs
- UserPersonalizationStateInfo.cs
- EncodingTable.cs
- RelationshipManager.cs
- WebBrowser.cs
- ToolboxItemImageConverter.cs
- BookmarkEventArgs.cs
- EventDescriptor.cs
- PropertyGridView.cs
- InstanceData.cs
- DefaultValueConverter.cs
- SqlUserDefinedTypeAttribute.cs
- InfocardChannelParameter.cs
- ScrollItemProviderWrapper.cs
- BaseDataBoundControl.cs
- TypeForwardedFromAttribute.cs
- xml.cs
- XhtmlConformanceSection.cs
- RawTextInputReport.cs
- PopupControlService.cs
- DataPagerCommandEventArgs.cs
- basevalidator.cs
- OLEDB_Enum.cs
- XsltArgumentList.cs
- ExtendedPropertyInfo.cs
- TextSelection.cs
- AlternateViewCollection.cs
- ClipboardData.cs
- HttpResponseInternalWrapper.cs
- FileDialog_Vista_Interop.cs
- RemotingException.cs
- NGCUIElementCollectionSerializerAsync.cs
- InputMethodStateTypeInfo.cs
- HuffmanTree.cs
- XPathBuilder.cs
- EdmComplexPropertyAttribute.cs
- DetailsViewInsertedEventArgs.cs
- DesignerActionPanel.cs
- Attributes.cs
- StoreItemCollection.cs
- TypeProvider.cs
- SafeFileHandle.cs
- ProviderException.cs
- CommonGetThemePartSize.cs
- DropDownButton.cs
- HandlerFactoryCache.cs
- CollectionViewSource.cs
- AbsoluteQuery.cs
- PublisherMembershipCondition.cs
- SoapIncludeAttribute.cs
- TextEditorSpelling.cs
- EditBehavior.cs
- XmlSchemas.cs
- TextProperties.cs
- Sql8ExpressionRewriter.cs
- CustomTrackingQuery.cs
- AndCondition.cs
- MetadataUtilsSmi.cs
- ComAdminWrapper.cs
- TraceUtility.cs
- MultilineStringConverter.cs
- StreamReader.cs
- TaiwanLunisolarCalendar.cs
- KeyboardNavigation.cs
- OutputCacheProfile.cs
- ElementHostPropertyMap.cs
- AddInToken.cs
- DesignTimeType.cs
- BindingValueChangedEventArgs.cs
- MachineKeySection.cs
- CountdownEvent.cs
- ExecutionEngineException.cs
- WebPartDescriptionCollection.cs
- WindowsToolbarAsMenu.cs
- MethodBuilder.cs
- DependencyProperty.cs
- MouseActionConverter.cs
- CqlWriter.cs
- UnknownWrapper.cs
- selecteditemcollection.cs
- ForceCopyBuildProvider.cs
- InternalSafeNativeMethods.cs
- SettingsContext.cs
- TypefaceMetricsCache.cs
- ListChangedEventArgs.cs
- SelectionItemPattern.cs
- UnmanagedMemoryStreamWrapper.cs
- PointLightBase.cs
- ClientData.cs
- StrongTypingException.cs
- ConnectionManagementElement.cs
- SamlDoNotCacheCondition.cs
- QilParameter.cs
- HttpCachePolicy.cs