Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Framework / System / Windows / FrameworkContextData.cs / 1 / FrameworkContextData.cs
using System.Windows.Threading;
using MS.Utility;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Windows
{
internal class FrameworkContextData
{
public static FrameworkContextData From(Dispatcher context)
{
FrameworkContextData data = (FrameworkContextData)context.Reserved2;
if (data == null)
{
data = new FrameworkContextData();
context.Reserved2 = data;
}
return data;
}
// Enforce never creating except via static constructor above.
private FrameworkContextData()
{
}
//
// Property Invalidation of Inheritable Properties
//
// At the context level, we need to keep track of all inheritable property invalidations currently
// in action. The reason that there can be multiple invalidations going on at the same time is because
// an invalidation of one property can cause an invalidation of a different property. The result is that
// the first invalidation *pauses* while the second invalidation is delivered to the tree.
//
// We keep track of these invalidations to be able to optimize a recursion of the same property
// invalidation from an element to that element's children. FrameworkElement.InvalidateTree will
// check the stack of walkers here and, if it finds a match, will conclude that a new DescendentsWalker
// need not be spun up. And there was much rejoicing.
//
public void AddWalker(object data, DescendentsWalkerBase walker)
{
// push a new walker on the top of the stack
WalkerEntry walkerEntry = new WalkerEntry();
walkerEntry.Data = data;
walkerEntry.Walker = walker;
_currentWalkers.Add(walkerEntry);
}
public void RemoveWalker(object data, DescendentsWalkerBase walker)
{
// pop the walker off the top of the stack
int last = _currentWalkers.Count - 1;
#if DEBUG
WalkerEntry walkerEntry = _currentWalkers[last];
Debug.Assert((walkerEntry.Data == data) && (walkerEntry.Walker == walker),
"Inheritance DescendentsWalker tracker removal failed");
#endif
_currentWalkers.RemoveAt(last);
}
public bool WasNodeVisited(DependencyObject d, object data)
{
// check to see if the given property on the given object is going to be visited by the
// DescendentsWalker on the top of the stack
if (_currentWalkers.Count > 0)
{
int last = _currentWalkers.Count - 1;
WalkerEntry walkerEntry = _currentWalkers[last];
if (walkerEntry.Data == data)
{
return walkerEntry.Walker.WasVisited(d);
}
}
return false;
}
private struct WalkerEntry
{
public object Data; // either the inheritable DP being invalidated, or the AncestorChangedDelegate, or the ResourceChangedDelegate
public DescendentsWalkerBase Walker;
}
private List _currentWalkers = new List(4);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System.Windows.Threading;
using MS.Utility;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Windows
{
internal class FrameworkContextData
{
public static FrameworkContextData From(Dispatcher context)
{
FrameworkContextData data = (FrameworkContextData)context.Reserved2;
if (data == null)
{
data = new FrameworkContextData();
context.Reserved2 = data;
}
return data;
}
// Enforce never creating except via static constructor above.
private FrameworkContextData()
{
}
//
// Property Invalidation of Inheritable Properties
//
// At the context level, we need to keep track of all inheritable property invalidations currently
// in action. The reason that there can be multiple invalidations going on at the same time is because
// an invalidation of one property can cause an invalidation of a different property. The result is that
// the first invalidation *pauses* while the second invalidation is delivered to the tree.
//
// We keep track of these invalidations to be able to optimize a recursion of the same property
// invalidation from an element to that element's children. FrameworkElement.InvalidateTree will
// check the stack of walkers here and, if it finds a match, will conclude that a new DescendentsWalker
// need not be spun up. And there was much rejoicing.
//
public void AddWalker(object data, DescendentsWalkerBase walker)
{
// push a new walker on the top of the stack
WalkerEntry walkerEntry = new WalkerEntry();
walkerEntry.Data = data;
walkerEntry.Walker = walker;
_currentWalkers.Add(walkerEntry);
}
public void RemoveWalker(object data, DescendentsWalkerBase walker)
{
// pop the walker off the top of the stack
int last = _currentWalkers.Count - 1;
#if DEBUG
WalkerEntry walkerEntry = _currentWalkers[last];
Debug.Assert((walkerEntry.Data == data) && (walkerEntry.Walker == walker),
"Inheritance DescendentsWalker tracker removal failed");
#endif
_currentWalkers.RemoveAt(last);
}
public bool WasNodeVisited(DependencyObject d, object data)
{
// check to see if the given property on the given object is going to be visited by the
// DescendentsWalker on the top of the stack
if (_currentWalkers.Count > 0)
{
int last = _currentWalkers.Count - 1;
WalkerEntry walkerEntry = _currentWalkers[last];
if (walkerEntry.Data == data)
{
return walkerEntry.Walker.WasVisited(d);
}
}
return false;
}
private struct WalkerEntry
{
public object Data; // either the inheritable DP being invalidated, or the AncestorChangedDelegate, or the ResourceChangedDelegate
public DescendentsWalkerBase Walker;
}
private List _currentWalkers = new List(4);
}
}
// 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
- DefaultBinder.cs
- ActivityInstanceReference.cs
- Transform3DGroup.cs
- CalendarButtonAutomationPeer.cs
- DatagridviewDisplayedBandsData.cs
- DomainUpDown.cs
- RegistrationProxy.cs
- followingsibling.cs
- EncryptedHeaderXml.cs
- RegisteredDisposeScript.cs
- StickyNote.cs
- RuntimeArgumentHandle.cs
- HighContrastHelper.cs
- ResourceDisplayNameAttribute.cs
- CellPartitioner.cs
- Sql8ExpressionRewriter.cs
- Socket.cs
- CharacterShapingProperties.cs
- SortableBindingList.cs
- TokenFactoryCredential.cs
- PageHandlerFactory.cs
- BroadcastEventHelper.cs
- ColorMatrix.cs
- GridViewSelectEventArgs.cs
- TableLayoutSettingsTypeConverter.cs
- SmiEventSink.cs
- UriExt.cs
- IUnknownConstantAttribute.cs
- GridViewItemAutomationPeer.cs
- UserCancellationException.cs
- DrawItemEvent.cs
- PointCollection.cs
- MSAANativeProvider.cs
- SolidBrush.cs
- PlainXmlDeserializer.cs
- IgnoreFileBuildProvider.cs
- TextEvent.cs
- VectorCollection.cs
- DataGridColumnDropSeparator.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- MultiSelector.cs
- StreamWriter.cs
- AuthenticationService.cs
- wmiprovider.cs
- TCEAdapterGenerator.cs
- SmtpFailedRecipientsException.cs
- NamespaceEmitter.cs
- ResourceManager.cs
- LogArchiveSnapshot.cs
- TransformerTypeCollection.cs
- ItemCollection.cs
- RectangleHotSpot.cs
- SecurityKeyEntropyMode.cs
- TimeStampChecker.cs
- IdnElement.cs
- ServiceChannel.cs
- ResetableIterator.cs
- WpfPayload.cs
- SqlUdtInfo.cs
- SourceInterpreter.cs
- SchemaTypeEmitter.cs
- _BasicClient.cs
- SystemIPAddressInformation.cs
- ToolStripDropDownMenu.cs
- SqlGenericUtil.cs
- AccessKeyManager.cs
- SoapInteropTypes.cs
- _SecureChannel.cs
- SrgsElementFactory.cs
- Frame.cs
- TextRunCacheImp.cs
- FixUpCollection.cs
- SizeConverter.cs
- AssertValidation.cs
- DataBoundControlAdapter.cs
- StreamGeometryContext.cs
- GlobalDataBindingHandler.cs
- Imaging.cs
- SoapHelper.cs
- SoapReflectionImporter.cs
- DynamicScriptObject.cs
- AvtEvent.cs
- TearOffProxy.cs
- PageRanges.cs
- AlternateView.cs
- CodePageEncoding.cs
- EdmRelationshipRoleAttribute.cs
- HuffmanTree.cs
- HttpResponseInternalWrapper.cs
- TableItemStyle.cs
- Atom10FeedFormatter.cs
- TextEditorCharacters.cs
- ScriptResourceHandler.cs
- StoreItemCollection.Loader.cs
- WindowsGrip.cs
- AssociationSetEnd.cs
- SqlProviderUtilities.cs
- ZeroOpNode.cs
- PhysicalOps.cs
- NavigatorOutput.cs