Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- versioninfo.cs
- PropertyTab.cs
- DSASignatureDeformatter.cs
- ObjectViewFactory.cs
- ResourcesChangeInfo.cs
- Point3DAnimationBase.cs
- fixedPageContentExtractor.cs
- ResourceExpressionBuilder.cs
- QuaternionAnimationUsingKeyFrames.cs
- PersonalizableAttribute.cs
- HashStream.cs
- EventSourceCreationData.cs
- Mapping.cs
- DateTimeOffsetConverter.cs
- SiteIdentityPermission.cs
- FileUtil.cs
- Range.cs
- HttpConfigurationSystem.cs
- TypeSystem.cs
- XmlSequenceWriter.cs
- NetworkInformationPermission.cs
- FormViewUpdatedEventArgs.cs
- AnimationClockResource.cs
- CrossSiteScriptingValidation.cs
- DynamicVirtualDiscoSearcher.cs
- SafeLibraryHandle.cs
- HttpCapabilitiesEvaluator.cs
- MsdtcWrapper.cs
- EdmFunctionAttribute.cs
- IsolatedStorageFileStream.cs
- AutomationEvent.cs
- TextContainerHelper.cs
- DynamicPropertyReader.cs
- LifetimeServices.cs
- log.cs
- TraceRecord.cs
- PrtTicket_Public.cs
- XmlUrlResolver.cs
- HtmlTitle.cs
- EntityUtil.cs
- TransportationConfigurationTypeInstallComponent.cs
- TdsParser.cs
- KeyInfo.cs
- IndexObject.cs
- XamlContextStack.cs
- Clipboard.cs
- CachedTypeface.cs
- JsonSerializer.cs
- RIPEMD160Managed.cs
- DynamicDataRouteHandler.cs
- TextCharacters.cs
- BinaryObjectWriter.cs
- HttpStaticObjectsCollectionBase.cs
- ExpressionList.cs
- HostedHttpContext.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- ContextQuery.cs
- GetMemberBinder.cs
- GridViewUpdateEventArgs.cs
- AdornerHitTestResult.cs
- KoreanLunisolarCalendar.cs
- MinimizableAttributeTypeConverter.cs
- MappingSource.cs
- RadialGradientBrush.cs
- SpecularMaterial.cs
- ParserContext.cs
- TextSelectionProcessor.cs
- ClientSettingsSection.cs
- SequenceRangeCollection.cs
- TransformCollection.cs
- ZipPackagePart.cs
- BindingCompleteEventArgs.cs
- SpellerInterop.cs
- IISMapPath.cs
- DesignerVerb.cs
- Document.cs
- SoapExtensionTypeElement.cs
- SelectionItemProviderWrapper.cs
- TextParagraphCache.cs
- TraceSection.cs
- PDBReader.cs
- OleDbError.cs
- FixUpCollection.cs
- OdbcCommandBuilder.cs
- ImageCodecInfoPrivate.cs
- ModelChangedEventArgsImpl.cs
- ModelPropertyDescriptor.cs
- UnionCodeGroup.cs
- CachingHintValidation.cs
- DispatcherProcessingDisabled.cs
- Int32Animation.cs
- DesignerActionUI.cs
- ScriptServiceAttribute.cs
- BindValidationContext.cs
- InstanceDataCollectionCollection.cs
- FilteredReadOnlyMetadataCollection.cs
- PageSettings.cs
- categoryentry.cs
- TypefaceMap.cs
- ZipFileInfoCollection.cs