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
- Parameter.cs
- AutomationProperty.cs
- SystemResources.cs
- DateBoldEvent.cs
- EndpointReference.cs
- ManifestSignedXml.cs
- WebPartCollection.cs
- TdsValueSetter.cs
- ClientCredentialsSecurityTokenManager.cs
- DocumentPageView.cs
- ListBindableAttribute.cs
- CodeTypeMemberCollection.cs
- DynamicILGenerator.cs
- srgsitem.cs
- XsdCachingReader.cs
- StatementContext.cs
- HttpListenerException.cs
- Byte.cs
- DataControlExtensions.cs
- IndependentAnimationStorage.cs
- BaseAppDomainProtocolHandler.cs
- DrawListViewItemEventArgs.cs
- DynamicExpression.cs
- DoubleAnimationClockResource.cs
- NullableDecimalMinMaxAggregationOperator.cs
- DispatcherHookEventArgs.cs
- _ChunkParse.cs
- DataGridTablesFactory.cs
- MarkupProperty.cs
- ChameleonKey.cs
- AuthorizationRule.cs
- AssemblyAttributesGoHere.cs
- AttachedAnnotation.cs
- DllHostInitializer.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- Subtree.cs
- MoveSizeWinEventHandler.cs
- SecurityState.cs
- MetafileHeader.cs
- PLINQETWProvider.cs
- BuildProviderUtils.cs
- NamedPermissionSet.cs
- AssociationType.cs
- ModelMemberCollection.cs
- BezierSegment.cs
- MemberAccessException.cs
- XmlSchemaImporter.cs
- ListMarkerSourceInfo.cs
- ScriptModule.cs
- BinaryKeyIdentifierClause.cs
- ProfileSection.cs
- BrowserCapabilitiesFactory.cs
- TextServicesDisplayAttributePropertyRanges.cs
- serverconfig.cs
- AsynchronousChannel.cs
- HuffCodec.cs
- ClassicBorderDecorator.cs
- EncoderReplacementFallback.cs
- ReferenceEqualityComparer.cs
- FormViewCommandEventArgs.cs
- SoapHeaderException.cs
- OutOfMemoryException.cs
- ClientScriptManager.cs
- HttpListenerResponse.cs
- SourceChangedEventArgs.cs
- SslStreamSecurityUpgradeProvider.cs
- APCustomTypeDescriptor.cs
- Transform.cs
- MatrixCamera.cs
- MembershipSection.cs
- DBSchemaTable.cs
- DelimitedListTraceListener.cs
- XPathException.cs
- EntityContainer.cs
- MetadataImporter.cs
- NamespaceImport.cs
- EntityProviderFactory.cs
- JsonDataContract.cs
- WebPartDisplayModeEventArgs.cs
- TableCellsCollectionEditor.cs
- ObjectManager.cs
- PropertyNames.cs
- DefaultValidator.cs
- DatagridviewDisplayedBandsData.cs
- SqlProfileProvider.cs
- DictationGrammar.cs
- PropertyCondition.cs
- SqlFunctionAttribute.cs
- MethodBuilderInstantiation.cs
- UnhandledExceptionEventArgs.cs
- ControlAdapter.cs
- IxmlLineInfo.cs
- AppModelKnownContentFactory.cs
- DPAPIProtectedConfigurationProvider.cs
- PageCodeDomTreeGenerator.cs
- XsltOutput.cs
- WSFederationHttpBindingCollectionElement.cs
- TextAutomationPeer.cs
- ListViewItem.cs
- ClientRoleProvider.cs