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
- Ray3DHitTestResult.cs
- CreateUserWizardStep.cs
- SqlInternalConnection.cs
- StylusPointPropertyInfoDefaults.cs
- HttpModuleActionCollection.cs
- QueryTaskGroupState.cs
- IdentitySection.cs
- DataBindingExpressionBuilder.cs
- RulePatternOps.cs
- AnnotationAuthorChangedEventArgs.cs
- BamlWriter.cs
- DbReferenceCollection.cs
- MetabaseServerConfig.cs
- VectorAnimation.cs
- ValidatorCompatibilityHelper.cs
- MergablePropertyAttribute.cs
- Thickness.cs
- WebControlsSection.cs
- Soap.cs
- VolatileEnlistmentState.cs
- TextContainerChangeEventArgs.cs
- XmlnsCompatibleWithAttribute.cs
- StrokeCollection2.cs
- WindowsGraphics2.cs
- TransactionFlowOption.cs
- RuntimeEnvironment.cs
- IndicFontClient.cs
- RelationshipEndCollection.cs
- xmlglyphRunInfo.cs
- ToolStripDropTargetManager.cs
- SqlDataSourceCustomCommandPanel.cs
- XmlSignatureProperties.cs
- GridItem.cs
- WebServiceMethodData.cs
- TextInfo.cs
- RangeContentEnumerator.cs
- Compiler.cs
- FrameDimension.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- QueryGenerator.cs
- ApplicationProxyInternal.cs
- EncryptedPackage.cs
- HoistedLocals.cs
- ColorMatrix.cs
- FamilyMapCollection.cs
- NotifyIcon.cs
- ViewGenerator.cs
- LazyTextWriterCreator.cs
- RSAOAEPKeyExchangeDeformatter.cs
- RemotingException.cs
- TrackBar.cs
- Html32TextWriter.cs
- PropertyBuilder.cs
- DrawingContext.cs
- ListManagerBindingsCollection.cs
- RegisteredHiddenField.cs
- FontDriver.cs
- Config.cs
- ClientOptions.cs
- Select.cs
- SettingsAttributeDictionary.cs
- Journaling.cs
- FileSystemWatcher.cs
- TraceSection.cs
- Int16Converter.cs
- ScalarOps.cs
- ObjectQuery.cs
- FrameworkTextComposition.cs
- DataGridViewColumnStateChangedEventArgs.cs
- TreeNodeStyle.cs
- TimeSpanStorage.cs
- XmlNodeComparer.cs
- Point.cs
- XmlSerializationReader.cs
- OperationCanceledException.cs
- EditCommandColumn.cs
- SequenceQuery.cs
- CodeNamespace.cs
- MaterialGroup.cs
- LinearKeyFrames.cs
- DataListGeneralPage.cs
- EventMappingSettingsCollection.cs
- GroupJoinQueryOperator.cs
- IntranetCredentialPolicy.cs
- DynamicUpdateCommand.cs
- Thumb.cs
- odbcmetadatafactory.cs
- XPathParser.cs
- HashCodeCombiner.cs
- MaskedTextBoxDesigner.cs
- AsymmetricAlgorithm.cs
- ReadOnlyAttribute.cs
- OutputCacheProfile.cs
- FontSourceCollection.cs
- TemplateControlBuildProvider.cs
- Translator.cs
- EdmItemCollection.OcAssemblyCache.cs
- Pts.cs
- MembershipValidatePasswordEventArgs.cs
- XmlCompatibilityReader.cs