Code:
/ 4.0 / 4.0 / 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. 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
- SystemUdpStatistics.cs
- RC2.cs
- parserscommon.cs
- invalidudtexception.cs
- HeaderedContentControl.cs
- OutputCacheModule.cs
- XamlStyleSerializer.cs
- ElementNotEnabledException.cs
- PhysicalOps.cs
- ECDsaCng.cs
- Vector3DAnimationBase.cs
- SrgsRuleRef.cs
- QueryRewriter.cs
- CodeObject.cs
- DataPagerCommandEventArgs.cs
- Exceptions.cs
- PropertyInformationCollection.cs
- ActivitiesCollection.cs
- XmlSchemaAttributeGroupRef.cs
- SoapElementAttribute.cs
- SharedUtils.cs
- DefaultEventAttribute.cs
- Mutex.cs
- SqlColumnizer.cs
- CatalogPartChrome.cs
- HandleDictionary.cs
- HtmlHistory.cs
- SystemIPv6InterfaceProperties.cs
- TableCellAutomationPeer.cs
- EtwTrace.cs
- MatrixTransform3D.cs
- ValidationPropertyAttribute.cs
- WebPartEditVerb.cs
- DataMember.cs
- SelectionBorderGlyph.cs
- COM2EnumConverter.cs
- DataGridColumnCollection.cs
- SHA1.cs
- UncommonField.cs
- HtmlTableCell.cs
- TypeConstant.cs
- FastPropertyAccessor.cs
- Root.cs
- ToolStripCodeDomSerializer.cs
- CodeFieldReferenceExpression.cs
- WindowsEditBox.cs
- ApplicationServiceManager.cs
- mediapermission.cs
- LocalizabilityAttribute.cs
- DataFormat.cs
- Triangle.cs
- StyleCollectionEditor.cs
- Schema.cs
- NetworkInformationException.cs
- ContextInformation.cs
- Rect3D.cs
- Unit.cs
- CmsInterop.cs
- XmlHierarchicalDataSourceView.cs
- ConnectionPointCookie.cs
- TextBoxBase.cs
- RunInstallerAttribute.cs
- EntityDataSourceReferenceGroup.cs
- StreamInfo.cs
- HwndSourceParameters.cs
- SiteMapDataSourceView.cs
- FunctionCommandText.cs
- WindowManager.cs
- ListSourceHelper.cs
- TreeNodeStyleCollectionEditor.cs
- WeakReferenceKey.cs
- ResourceKey.cs
- OverrideMode.cs
- HealthMonitoringSection.cs
- DataServiceQueryException.cs
- Deflater.cs
- ProgressiveCrcCalculatingStream.cs
- EmptyStringExpandableObjectConverter.cs
- CapiNative.cs
- DesignSurfaceEvent.cs
- Visual3D.cs
- DataGridViewCellLinkedList.cs
- CodeAttributeDeclaration.cs
- MexTcpBindingElement.cs
- CachedPathData.cs
- MenuStrip.cs
- HtmlMeta.cs
- StringResourceManager.cs
- TargetControlTypeCache.cs
- EntitySetBase.cs
- HtmlElementErrorEventArgs.cs
- Certificate.cs
- TextRange.cs
- LogRecordSequence.cs
- WinInet.cs
- AuthenticationService.cs
- SocketInformation.cs
- XmlHierarchyData.cs
- BufferedGraphicsManager.cs
- CollectionViewGroupInternal.cs