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
- FileDetails.cs
- QilStrConcatenator.cs
- EventTask.cs
- MsmqIntegrationValidationBehavior.cs
- RedBlackList.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- SplitterPanel.cs
- ProtectedConfiguration.cs
- ClientConfigurationHost.cs
- CompressionTransform.cs
- HScrollProperties.cs
- StatusBarItem.cs
- ViewgenGatekeeper.cs
- SortKey.cs
- Interlocked.cs
- WindowsIdentity.cs
- DESCryptoServiceProvider.cs
- InstanceKeyView.cs
- ByteAnimationBase.cs
- FamilyTypeface.cs
- DocumentStatusResources.cs
- Tool.cs
- Task.cs
- BlurBitmapEffect.cs
- XmlDataContract.cs
- ToolStripButton.cs
- ImageListStreamer.cs
- SiteMapNodeItemEventArgs.cs
- DataGridCheckBoxColumn.cs
- XslAstAnalyzer.cs
- X509PeerCertificateElement.cs
- ProviderMetadata.cs
- PointHitTestParameters.cs
- NetMsmqBindingElement.cs
- DocumentReferenceCollection.cs
- DuplicateMessageDetector.cs
- CommonRemoteMemoryBlock.cs
- FontStretchConverter.cs
- MessageHeaderAttribute.cs
- ResourceCategoryAttribute.cs
- SecurityState.cs
- Int32Rect.cs
- TrustLevel.cs
- RectConverter.cs
- XDeferredAxisSource.cs
- XmlNullResolver.cs
- DataGridRowAutomationPeer.cs
- ColumnCollection.cs
- DNS.cs
- CustomErrorsSectionWrapper.cs
- QueryOperationResponseOfT.cs
- PropertyMap.cs
- MessageQueueEnumerator.cs
- TreeNodeBinding.cs
- HMACSHA256.cs
- LinkDescriptor.cs
- BitmapFrame.cs
- BufferBuilder.cs
- QilLiteral.cs
- UTF32Encoding.cs
- UInt32Storage.cs
- WindowsFormsHostAutomationPeer.cs
- SafeFileMapViewHandle.cs
- RuntimeHelpers.cs
- LayoutEditorPart.cs
- DataReaderContainer.cs
- Enum.cs
- Trace.cs
- ProxyWebPart.cs
- TreeBuilder.cs
- XhtmlConformanceSection.cs
- ExpressionValueEditor.cs
- Msmq4SubqueuePoisonHandler.cs
- IHttpResponseInternal.cs
- Sentence.cs
- WizardSideBarListControlItemEventArgs.cs
- TransformDescriptor.cs
- Blend.cs
- BitmapImage.cs
- MediaTimeline.cs
- MiniConstructorInfo.cs
- HashAlgorithm.cs
- COMException.cs
- UIElementParagraph.cs
- PropertyTabChangedEvent.cs
- RangeValueProviderWrapper.cs
- CapabilitiesSection.cs
- RenderTargetBitmap.cs
- ConnectionStringsExpressionBuilder.cs
- CollectionBuilder.cs
- DataGridToolTip.cs
- ProfessionalColorTable.cs
- DataGridCellItemAutomationPeer.cs
- OracleParameterCollection.cs
- XmlSchemaValidator.cs
- GroupStyle.cs
- basemetadatamappingvisitor.cs
- TargetParameterCountException.cs
- _ProxyRegBlob.cs
- ReflectTypeDescriptionProvider.cs