Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / PrePostDescendentsWalker.cs / 1305600 / PrePostDescendentsWalker.cs
//------------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description:
// A simple subclass of DescendentsWalker which introduces a second callback
// which is called after a node's children have been visited.
//
// History:
// 04/13/2004: rruiz: Introduces class.
// 10/20/2004: rruiz: Moved class to MS.Internal.
//
//-----------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using MS.Utility;
namespace MS.Internal
{
///
/// A simple subclass of DescendentsWalker which introduces a second callback
/// which is called after a node's children have been visited.
///
internal class PrePostDescendentsWalker : DescendentsWalker
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Creates an instances of PrePostDescendentsWalker.
///
/// specifies which tree should be visited first
/// the callback to be called before a node's children are visited
/// the callback to be called after a node's children are visited
/// the data passed to each callback
public PrePostDescendentsWalker(TreeWalkPriority priority, VisitedCallback preCallback, VisitedCallback postCallback, T data) :
base(priority, preCallback, data)
{
_postCallback = postCallback;
}
#endregion Constructors
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
///
/// Starts the walking process for the given node.
///
/// the node to start the walk on
/// whether or not the first node should have the callbacks called on it
public override void StartWalk(DependencyObject startNode, bool skipStartNode)
{
try
{
base.StartWalk(startNode, skipStartNode);
}
finally
{
if (!skipStartNode)
{
if (_postCallback != null)
{
// This type checking is done in DescendentsWalker. Doing it here
// keeps us consistent.
if (FrameworkElement.DType.IsInstanceOfType(startNode) || FrameworkContentElement.DType.IsInstanceOfType(startNode))
{
_postCallback(startNode, this.Data);
}
}
}
}
}
#endregion Public Methods
//------------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
///
/// This method is called for every node touched during a walking of
/// the tree. Some nodes may not have this called if the preCallback
/// returns false - thereby preventing its subtree from being visited.
///
/// the node to visit
protected override void _VisitNode(DependencyObject d)
{
try
{
base._VisitNode(d);
}
finally
{
if (_postCallback != null)
{
_postCallback(d, this.Data);
}
}
}
#endregion Protected Methods
//-----------------------------------------------------
//
// Private Properties
//
//------------------------------------------------------
#region Private Properties
private VisitedCallback _postCallback;
#endregion Private Properties
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description:
// A simple subclass of DescendentsWalker which introduces a second callback
// which is called after a node's children have been visited.
//
// History:
// 04/13/2004: rruiz: Introduces class.
// 10/20/2004: rruiz: Moved class to MS.Internal.
//
//-----------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using MS.Utility;
namespace MS.Internal
{
///
/// A simple subclass of DescendentsWalker which introduces a second callback
/// which is called after a node's children have been visited.
///
internal class PrePostDescendentsWalker : DescendentsWalker
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Creates an instances of PrePostDescendentsWalker.
///
/// specifies which tree should be visited first
/// the callback to be called before a node's children are visited
/// the callback to be called after a node's children are visited
/// the data passed to each callback
public PrePostDescendentsWalker(TreeWalkPriority priority, VisitedCallback preCallback, VisitedCallback postCallback, T data) :
base(priority, preCallback, data)
{
_postCallback = postCallback;
}
#endregion Constructors
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
///
/// Starts the walking process for the given node.
///
/// the node to start the walk on
/// whether or not the first node should have the callbacks called on it
public override void StartWalk(DependencyObject startNode, bool skipStartNode)
{
try
{
base.StartWalk(startNode, skipStartNode);
}
finally
{
if (!skipStartNode)
{
if (_postCallback != null)
{
// This type checking is done in DescendentsWalker. Doing it here
// keeps us consistent.
if (FrameworkElement.DType.IsInstanceOfType(startNode) || FrameworkContentElement.DType.IsInstanceOfType(startNode))
{
_postCallback(startNode, this.Data);
}
}
}
}
}
#endregion Public Methods
//------------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
///
/// This method is called for every node touched during a walking of
/// the tree. Some nodes may not have this called if the preCallback
/// returns false - thereby preventing its subtree from being visited.
///
/// the node to visit
protected override void _VisitNode(DependencyObject d)
{
try
{
base._VisitNode(d);
}
finally
{
if (_postCallback != null)
{
_postCallback(d, this.Data);
}
}
}
#endregion Protected Methods
//-----------------------------------------------------
//
// Private Properties
//
//------------------------------------------------------
#region Private Properties
private VisitedCallback _postCallback;
#endregion Private Properties
}
}
// 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
- ConfigurationPermission.cs
- TitleStyle.cs
- AvTraceDetails.cs
- ProgressiveCrcCalculatingStream.cs
- SoapEnumAttribute.cs
- GregorianCalendar.cs
- TypeBuilder.cs
- QueryGeneratorBase.cs
- RegexWriter.cs
- ContextMenu.cs
- ContentElement.cs
- WebColorConverter.cs
- CryptoStream.cs
- ModelUIElement3D.cs
- ListSortDescription.cs
- AssociationSetEnd.cs
- PerfCounters.cs
- NumberSubstitution.cs
- DataGridViewAutoSizeModeEventArgs.cs
- NotImplementedException.cs
- GrammarBuilderPhrase.cs
- Errors.cs
- MasterPageCodeDomTreeGenerator.cs
- WebMethodAttribute.cs
- WindowsRegion.cs
- StatusBarItem.cs
- iisPickupDirectory.cs
- XmlLangPropertyAttribute.cs
- LogicalMethodInfo.cs
- WinCategoryAttribute.cs
- DependencyObjectType.cs
- _TimerThread.cs
- PersistChildrenAttribute.cs
- WeakEventManager.cs
- AddInEnvironment.cs
- DataRelationPropertyDescriptor.cs
- UserControlBuildProvider.cs
- Page.cs
- CircleHotSpot.cs
- NameNode.cs
- RouteItem.cs
- XmlQueryContext.cs
- FrameworkObject.cs
- AddInProcess.cs
- InvokeGenerator.cs
- HtmlInputReset.cs
- peernodeimplementation.cs
- XamlRtfConverter.cs
- EmbeddedMailObjectCollectionEditor.cs
- XmlNavigatorFilter.cs
- prefixendpointaddressmessagefiltertable.cs
- FieldTemplateFactory.cs
- SelectionProviderWrapper.cs
- wmiprovider.cs
- PropertyMap.cs
- SymbolType.cs
- CubicEase.cs
- AppendHelper.cs
- InsufficientMemoryException.cs
- RandomDelaySendsAsyncResult.cs
- DispatcherExceptionFilterEventArgs.cs
- ExceptionWrapper.cs
- _ListenerRequestStream.cs
- TagNameToTypeMapper.cs
- NullableConverter.cs
- EntityConnection.cs
- TransactionException.cs
- BoundingRectTracker.cs
- ObjectAnimationBase.cs
- MenuScrollingVisibilityConverter.cs
- ApplicationActivator.cs
- PeerCollaboration.cs
- HttpWebRequest.cs
- DynamicControlParameter.cs
- PolyBezierSegment.cs
- RestHandler.cs
- RectConverter.cs
- ResourceWriter.cs
- AsyncResult.cs
- ExtensionQuery.cs
- BlurBitmapEffect.cs
- TemplatePropertyEntry.cs
- Material.cs
- EventItfInfo.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- CodeMemberMethod.cs
- storepermissionattribute.cs
- ParameterCollection.cs
- PointCollectionValueSerializer.cs
- SchemaImporter.cs
- CodeDomSerializerBase.cs
- MasterPageParser.cs
- CodeIdentifier.cs
- ColorContext.cs
- EventArgs.cs
- XsltConvert.cs
- DropDownList.cs
- IteratorFilter.cs
- ButtonFieldBase.cs
- baseaxisquery.cs