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
- RecordsAffectedEventArgs.cs
- Timer.cs
- LabelLiteral.cs
- PowerEase.cs
- DebuggerAttributes.cs
- Timeline.cs
- Blend.cs
- FileIOPermission.cs
- HandlerFactoryCache.cs
- DesignerSelectionListAdapter.cs
- LinqDataSourceHelper.cs
- WindowsComboBox.cs
- OdbcFactory.cs
- PropertyChangedEventManager.cs
- TranslateTransform3D.cs
- AbsoluteQuery.cs
- FileChangesMonitor.cs
- DispatcherProcessingDisabled.cs
- CollectionTypeElement.cs
- RenderingBiasValidation.cs
- Size.cs
- OpenFileDialog.cs
- WebPartConnectionsCancelVerb.cs
- XmlSerializableWriter.cs
- DataTemplateSelector.cs
- DataGridViewCellConverter.cs
- PeerHopCountAttribute.cs
- OleAutBinder.cs
- XmlObjectSerializerWriteContext.cs
- Matrix3D.cs
- XPathMessageFilterElementComparer.cs
- SecurityDocument.cs
- SerializerWriterEventHandlers.cs
- MethodAccessException.cs
- HistoryEventArgs.cs
- Expression.cs
- PrefixQName.cs
- Stack.cs
- TableAutomationPeer.cs
- Bits.cs
- Single.cs
- DateTimeConverter.cs
- DescriptionAttribute.cs
- CultureInfoConverter.cs
- AnonymousIdentificationModule.cs
- SoapFormatterSinks.cs
- HostingEnvironmentWrapper.cs
- ComponentChangingEvent.cs
- XsltLibrary.cs
- itemelement.cs
- PeerEndPoint.cs
- NotifyIcon.cs
- Span.cs
- ListView.cs
- ValidatorCompatibilityHelper.cs
- ElementUtil.cs
- ServiceMemoryGates.cs
- FileDetails.cs
- BaseResourcesBuildProvider.cs
- DataTableMappingCollection.cs
- CaseCqlBlock.cs
- ProfileSection.cs
- NetPeerTcpBindingCollectionElement.cs
- Int32Rect.cs
- DbConnectionPool.cs
- wgx_commands.cs
- LinqDataSourceContextEventArgs.cs
- ZipPackagePart.cs
- DataContractSerializerOperationGenerator.cs
- OleDbFactory.cs
- FontSource.cs
- RSAPKCS1SignatureDeformatter.cs
- SchemaAttDef.cs
- IODescriptionAttribute.cs
- TagPrefixInfo.cs
- DSASignatureDeformatter.cs
- Axis.cs
- NotifyIcon.cs
- DES.cs
- CommonDialog.cs
- ImagingCache.cs
- DataPagerFieldItem.cs
- ImageField.cs
- StringAnimationUsingKeyFrames.cs
- DuplexChannelBinder.cs
- CompilationPass2Task.cs
- FrugalMap.cs
- SamlDoNotCacheCondition.cs
- TdsRecordBufferSetter.cs
- HtmlHead.cs
- RealizationDrawingContextWalker.cs
- TypeConverterHelper.cs
- OperatingSystem.cs
- StrokeCollection.cs
- Int32RectValueSerializer.cs
- InstanceView.cs
- Automation.cs
- DataSourceXmlElementAttribute.cs
- DecoderFallbackWithFailureFlag.cs
- TaiwanCalendar.cs