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
- MouseButtonEventArgs.cs
- XdrBuilder.cs
- DocumentStream.cs
- BaseHashHelper.cs
- DatatypeImplementation.cs
- CharAnimationUsingKeyFrames.cs
- DeclarativeCatalogPartDesigner.cs
- ComponentResourceKeyConverter.cs
- HtmlFormAdapter.cs
- Mappings.cs
- SiteMapNodeCollection.cs
- ClientFormsIdentity.cs
- dtdvalidator.cs
- ExceptionUtil.cs
- GroupPartitionExpr.cs
- XmlResolver.cs
- ActivityPreviewDesigner.cs
- DataGridAddNewRow.cs
- CodeNamespaceImport.cs
- ThrowHelper.cs
- WbemException.cs
- PathGeometry.cs
- TypeHelpers.cs
- DecoderExceptionFallback.cs
- SqlFlattener.cs
- TextRunCache.cs
- DataRowChangeEvent.cs
- Wizard.cs
- FormatConvertedBitmap.cs
- SchemaExporter.cs
- AxWrapperGen.cs
- GroupAggregateExpr.cs
- PropertyValueUIItem.cs
- arc.cs
- SqlTrackingQuery.cs
- WebPartTracker.cs
- InkCanvasSelectionAdorner.cs
- TableLayoutRowStyleCollection.cs
- xsdvalidator.cs
- EnumMemberAttribute.cs
- IntegerValidator.cs
- DBCSCodePageEncoding.cs
- SQLChars.cs
- PersonalizationStateInfo.cs
- XPathNodeList.cs
- InputLanguage.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- HTMLTextWriter.cs
- PublisherMembershipCondition.cs
- HtmlGenericControl.cs
- SqlAggregateChecker.cs
- ContainerCodeDomSerializer.cs
- MemoryMappedFile.cs
- DrawingServices.cs
- EntityDataSourceSelectingEventArgs.cs
- ParsedAttributeCollection.cs
- UpDownEvent.cs
- HWStack.cs
- CodeSnippetExpression.cs
- FrameSecurityDescriptor.cs
- DrawingContextWalker.cs
- ProfileProvider.cs
- ContentFileHelper.cs
- EntityWithChangeTrackerStrategy.cs
- MouseGesture.cs
- DecodeHelper.cs
- HttpGetClientProtocol.cs
- HtmlHistory.cs
- ServicesUtilities.cs
- ModifiableIteratorCollection.cs
- FixedNode.cs
- XmlDataProvider.cs
- AppSettingsExpressionBuilder.cs
- DrawTreeNodeEventArgs.cs
- XmlName.cs
- WebPartUtil.cs
- PropertyPath.cs
- UpdateException.cs
- ConnectivityStatus.cs
- AnnotationResource.cs
- ResourceWriter.cs
- ImageIndexConverter.cs
- RuntimeEnvironment.cs
- ProcessThreadCollection.cs
- ColorContextHelper.cs
- TextEditorSelection.cs
- XmlWriterDelegator.cs
- SpecialTypeDataContract.cs
- TryCatchDesigner.xaml.cs
- RedirectionProxy.cs
- TextTreeRootNode.cs
- EventSetter.cs
- XslException.cs
- XsltFunctions.cs
- QilGenerator.cs
- FragmentNavigationEventArgs.cs
- PageThemeCodeDomTreeGenerator.cs
- HotCommands.cs
- InputMethod.cs
- CompiledScopeCriteria.cs