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
- SchemaNotation.cs
- ProcessInfo.cs
- DataIdProcessor.cs
- FontNamesConverter.cs
- TreeNodeMouseHoverEvent.cs
- AutomationEventArgs.cs
- BufferedWebEventProvider.cs
- WebPartHelpVerb.cs
- ObjectKeyFrameCollection.cs
- Event.cs
- RelAssertionDirectKeyIdentifierClause.cs
- SpecialFolderEnumConverter.cs
- InputManager.cs
- DataObjectAttribute.cs
- GridView.cs
- PageEventArgs.cs
- ConfigXmlSignificantWhitespace.cs
- Rijndael.cs
- SQLByteStorage.cs
- FlowLayoutSettings.cs
- HebrewNumber.cs
- TypeToken.cs
- DetailsViewAutoFormat.cs
- RectangleGeometry.cs
- ListControl.cs
- Errors.cs
- GenericIdentity.cs
- HtmlTable.cs
- BrowserInteropHelper.cs
- CompilerGeneratedAttribute.cs
- SerializationException.cs
- AuthenticationService.cs
- NavigatingCancelEventArgs.cs
- SubMenuStyle.cs
- PointLight.cs
- LightweightCodeGenerator.cs
- FormsAuthenticationCredentials.cs
- InfoCardClaim.cs
- ContentControl.cs
- ToolStripContentPanelRenderEventArgs.cs
- HWStack.cs
- DataContract.cs
- GCHandleCookieTable.cs
- EntityDataSourceReferenceGroup.cs
- ToolboxSnapDragDropEventArgs.cs
- EncryptedData.cs
- PartitionedStreamMerger.cs
- XmlDataProvider.cs
- Crc32.cs
- PkcsMisc.cs
- ListSourceHelper.cs
- RightsManagementInformation.cs
- SiteMapPath.cs
- SolidColorBrush.cs
- CellPartitioner.cs
- XNameConverter.cs
- ContentPlaceHolderDesigner.cs
- ToolStripComboBox.cs
- SecurityBindingElementImporter.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- WmlLabelAdapter.cs
- NamespaceExpr.cs
- WorkflowEnvironment.cs
- PointCollectionConverter.cs
- XmlUtil.cs
- RuleProcessor.cs
- AssociationType.cs
- IndexedString.cs
- ActivityCodeDomReferenceService.cs
- SByteStorage.cs
- ActivationProxy.cs
- DeviceContexts.cs
- Transform.cs
- ErrorWebPart.cs
- TableItemStyle.cs
- ListViewCancelEventArgs.cs
- MatrixTransform3D.cs
- XmlChildEnumerator.cs
- SuppressIldasmAttribute.cs
- Graphics.cs
- IntMinMaxAggregationOperator.cs
- MessageRpc.cs
- DrawingImage.cs
- XPathAxisIterator.cs
- SqlDataSourceQueryEditor.cs
- _DisconnectOverlappedAsyncResult.cs
- NativeCompoundFileAPIs.cs
- DataViewSetting.cs
- DoubleAnimation.cs
- TemplateAction.cs
- XamlTypeMapper.cs
- GifBitmapEncoder.cs
- DataSourceView.cs
- Constants.cs
- UserMapPath.cs
- LexicalChunk.cs
- XmlAttributeOverrides.cs
- XmlNodeList.cs
- VariableReference.cs
- safelinkcollection.cs