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
- CodeAttachEventStatement.cs
- CodeDesigner.cs
- DataServiceConfiguration.cs
- PackWebRequest.cs
- basemetadatamappingvisitor.cs
- PopupEventArgs.cs
- SmiRequestExecutor.cs
- PackWebRequest.cs
- CreateDataSourceDialog.cs
- EventSourceCreationData.cs
- ReceiveSecurityHeader.cs
- StrokeFIndices.cs
- UpDownEvent.cs
- AnimatedTypeHelpers.cs
- MessageSecurityOverHttpElement.cs
- RegexWriter.cs
- TemplateColumn.cs
- BamlResourceDeserializer.cs
- HtmlGenericControl.cs
- rsa.cs
- DetailsViewRow.cs
- TreeView.cs
- DictionaryChange.cs
- SHA256Cng.cs
- NaturalLanguageHyphenator.cs
- Bidi.cs
- SymLanguageType.cs
- XmlReflectionMember.cs
- DrawTreeNodeEventArgs.cs
- HtmlAnchor.cs
- ResourceProviderFactory.cs
- BamlLocalizer.cs
- FormsAuthenticationTicket.cs
- DesignerActionPropertyItem.cs
- IInstanceTable.cs
- X509CertificateTrustedIssuerElement.cs
- WindowsSlider.cs
- FacetChecker.cs
- WebRequestModuleElement.cs
- _ScatterGatherBuffers.cs
- XPathSelectionIterator.cs
- TagElement.cs
- EventMappingSettingsCollection.cs
- CodePropertyReferenceExpression.cs
- CollectionViewGroupInternal.cs
- GraphicsPathIterator.cs
- SettingsBase.cs
- ColumnMapProcessor.cs
- MailHeaderInfo.cs
- odbcmetadatacollectionnames.cs
- X509CertificateChain.cs
- PrintControllerWithStatusDialog.cs
- RtfToXamlReader.cs
- SerialReceived.cs
- RuleDefinitions.cs
- CodeDomConfigurationHandler.cs
- HttpHostedTransportConfiguration.cs
- MenuItemStyleCollection.cs
- RelationshipWrapper.cs
- RepeaterCommandEventArgs.cs
- ItemAutomationPeer.cs
- HtmlAnchor.cs
- SerializationSectionGroup.cs
- KerberosReceiverSecurityToken.cs
- DataGridViewColumnCollection.cs
- Brush.cs
- BitmapFrameEncode.cs
- XamlDesignerSerializationManager.cs
- VisualStyleInformation.cs
- ProxyWebPartManager.cs
- IIS7UserPrincipal.cs
- BinaryObjectReader.cs
- TextTreeRootTextBlock.cs
- XmlAttributeOverrides.cs
- PropertyValue.cs
- WebSysDisplayNameAttribute.cs
- HttpModule.cs
- FullTrustAssembliesSection.cs
- UIElement3D.cs
- SerializerWriterEventHandlers.cs
- MetadataUtil.cs
- StringAnimationBase.cs
- MarkupProperty.cs
- DataGridViewDataConnection.cs
- DependencySource.cs
- StringArrayConverter.cs
- shaper.cs
- SQLSingle.cs
- SoapIgnoreAttribute.cs
- WmpBitmapEncoder.cs
- ArrayHelper.cs
- AssociationEndMember.cs
- BufferAllocator.cs
- CornerRadiusConverter.cs
- DataGridViewToolTip.cs
- CodeMemberProperty.cs
- OdbcReferenceCollection.cs
- MobileDeviceCapabilitiesSectionHandler.cs
- ColorMatrix.cs
- ProxyHelper.cs