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
- TypeBuilder.cs
- WindowsComboBox.cs
- CreateBookmarkScope.cs
- ToolStripItemEventArgs.cs
- MasterPageParser.cs
- safemediahandle.cs
- ObservableCollection.cs
- HelpExampleGenerator.cs
- XmlEncodedRawTextWriter.cs
- XamlFigureLengthSerializer.cs
- TTSEngineTypes.cs
- Axis.cs
- SecUtil.cs
- AssemblySettingAttributes.cs
- GrammarBuilderBase.cs
- TypeDescriptor.cs
- IMembershipProvider.cs
- CodeEventReferenceExpression.cs
- Byte.cs
- ReadOnlyDictionary.cs
- Compiler.cs
- EndOfStreamException.cs
- DetailsViewInsertedEventArgs.cs
- HwndSubclass.cs
- KernelTypeValidation.cs
- MouseButtonEventArgs.cs
- CategoryNameCollection.cs
- ExclusiveCanonicalizationTransform.cs
- ToolStripSeparatorRenderEventArgs.cs
- CachedFontFamily.cs
- XmlSchemaAttributeGroupRef.cs
- XmlCharCheckingWriter.cs
- HelpKeywordAttribute.cs
- CopyNodeSetAction.cs
- WorkItem.cs
- StylusPlugin.cs
- MailWriter.cs
- SkewTransform.cs
- SoapReflectionImporter.cs
- NamespaceEmitter.cs
- InstanceContextMode.cs
- TextReader.cs
- WebPartConnectionsConnectVerb.cs
- DbgUtil.cs
- Brush.cs
- HttpAsyncResult.cs
- TextRangeAdaptor.cs
- CodeCatchClauseCollection.cs
- TabletDeviceInfo.cs
- EditingCommands.cs
- WebPartHeaderCloseVerb.cs
- TextDecorationLocationValidation.cs
- TraceContextEventArgs.cs
- ModifierKeysValueSerializer.cs
- AnimationTimeline.cs
- DatePickerDateValidationErrorEventArgs.cs
- Image.cs
- ClientRuntimeConfig.cs
- SrgsToken.cs
- validation.cs
- XmlMapping.cs
- StatusBar.cs
- ParallelDesigner.cs
- odbcmetadatacolumnnames.cs
- PermissionSetTriple.cs
- hebrewshape.cs
- ConstraintConverter.cs
- Event.cs
- ToolStripManager.cs
- SharedPersonalizationStateInfo.cs
- NotSupportedException.cs
- WpfPayload.cs
- ByeMessageApril2005.cs
- SemanticAnalyzer.cs
- Int32Collection.cs
- QueryOperatorEnumerator.cs
- StringUtil.cs
- XmlSchemaSequence.cs
- BinaryMethodMessage.cs
- DrawingGroupDrawingContext.cs
- LocalIdKeyIdentifierClause.cs
- WebPartDescriptionCollection.cs
- ExternalException.cs
- GroupLabel.cs
- ReplyChannelBinder.cs
- DoubleCollectionConverter.cs
- XmlDataSourceNodeDescriptor.cs
- StorageEntityContainerMapping.cs
- MemoryMappedFileSecurity.cs
- SqlStream.cs
- GenericWebPart.cs
- Funcletizer.cs
- TemplatePropertyEntry.cs
- mda.cs
- FamilyTypeface.cs
- TabletDevice.cs
- ProfilePropertySettingsCollection.cs
- UriExt.cs
- WebSysDefaultValueAttribute.cs
- safelink.cs