Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / FrameworkContextData.cs / 1305600 / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ConfigurationException.cs
- ResourceDictionaryCollection.cs
- CellRelation.cs
- DataGridTextBox.cs
- QilTernary.cs
- ProtocolViolationException.cs
- WebPartMinimizeVerb.cs
- ComponentDispatcherThread.cs
- WeakKeyDictionary.cs
- SignedInfo.cs
- ChangeProcessor.cs
- FileInfo.cs
- GregorianCalendarHelper.cs
- BuildProvider.cs
- ControlUtil.cs
- MsmqOutputMessage.cs
- DataSourceSelectArguments.cs
- SqlTypesSchemaImporter.cs
- CompositeDuplexBindingElementImporter.cs
- PartitionerStatic.cs
- VirtualDirectoryMappingCollection.cs
- PointHitTestResult.cs
- StylusPointProperty.cs
- MimePart.cs
- ServiceX509SecurityTokenProvider.cs
- PolyBezierSegment.cs
- GeneralTransform3D.cs
- HMACSHA384.cs
- RowTypeElement.cs
- XmlTextEncoder.cs
- DetailsView.cs
- SurrogateChar.cs
- X509Utils.cs
- ImmutablePropertyDescriptorGridEntry.cs
- KnownTypeAttribute.cs
- GeneralTransform3DGroup.cs
- OracleInfoMessageEventArgs.cs
- PtsContext.cs
- DesignerSerializationOptionsAttribute.cs
- TextServicesContext.cs
- ToolStripMenuItemCodeDomSerializer.cs
- xmlglyphRunInfo.cs
- UpdateException.cs
- CharAnimationUsingKeyFrames.cs
- OperatingSystem.cs
- TabControlEvent.cs
- StringWriter.cs
- ThemeableAttribute.cs
- FrameworkObject.cs
- LoadGrammarCompletedEventArgs.cs
- odbcmetadatacollectionnames.cs
- PersistenceMetadataNamespace.cs
- PageVisual.cs
- ModelUtilities.cs
- Quaternion.cs
- Matrix.cs
- SessionStateSection.cs
- MailAddress.cs
- ICspAsymmetricAlgorithm.cs
- DesignParameter.cs
- SingleObjectCollection.cs
- PartialClassGenerationTaskInternal.cs
- StringCollection.cs
- MDIWindowDialog.cs
- EventlogProvider.cs
- AnimationTimeline.cs
- WindowProviderWrapper.cs
- HttpWebRequestElement.cs
- ValidatingReaderNodeData.cs
- ListBase.cs
- SettingsAttributes.cs
- AdRotator.cs
- CodeEventReferenceExpression.cs
- GradientStopCollection.cs
- VirtualDirectoryMapping.cs
- HwndSourceKeyboardInputSite.cs
- RequestStatusBarUpdateEventArgs.cs
- XMLUtil.cs
- BaseTemplateBuildProvider.cs
- RoutedCommand.cs
- ProtocolsConfigurationHandler.cs
- HyperlinkAutomationPeer.cs
- EncoderParameter.cs
- PropertyChangeTracker.cs
- BitmapSizeOptions.cs
- UserPreferenceChangingEventArgs.cs
- BaseResourcesBuildProvider.cs
- ScrollChrome.cs
- SocketAddress.cs
- MissingSatelliteAssemblyException.cs
- GetChildSubtree.cs
- PropertyGroupDescription.cs
- RangeBase.cs
- NativeMethodsOther.cs
- Point3DAnimationBase.cs
- JavascriptCallbackResponseProperty.cs
- GC.cs
- TextDecorationCollectionConverter.cs
- CancelRequestedRecord.cs
- Decorator.cs