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
- TableDetailsRow.cs
- TypeConverterMarkupExtension.cs
- PaintValueEventArgs.cs
- ColorMatrix.cs
- WS2007HttpBindingCollectionElement.cs
- KerberosSecurityTokenAuthenticator.cs
- DiscoveryInnerClientAdhoc11.cs
- LinearGradientBrush.cs
- SqlBulkCopyColumnMappingCollection.cs
- ParameterCollection.cs
- ZeroOpNode.cs
- DetailsViewUpdatedEventArgs.cs
- LinkConverter.cs
- SafeEventLogWriteHandle.cs
- HandlerFactoryWrapper.cs
- XPathDocumentBuilder.cs
- GridViewCancelEditEventArgs.cs
- MimeObjectFactory.cs
- AggregateException.cs
- XslAst.cs
- _NegoState.cs
- ConstNode.cs
- DataGridItemCollection.cs
- ToolStripSystemRenderer.cs
- MappingSource.cs
- CurrentChangingEventManager.cs
- TypeUtil.cs
- NotifyInputEventArgs.cs
- WsdlBuildProvider.cs
- Stack.cs
- LinkClickEvent.cs
- Sentence.cs
- XhtmlBasicPhoneCallAdapter.cs
- HighContrastHelper.cs
- XsdDataContractExporter.cs
- ContentPlaceHolder.cs
- ParameterCollectionEditor.cs
- JoinElimination.cs
- StandardCommands.cs
- IgnoreFlushAndCloseStream.cs
- BatchParser.cs
- ImportCatalogPart.cs
- StyleHelper.cs
- RegistryPermission.cs
- HashRepartitionStream.cs
- IntSumAggregationOperator.cs
- _emptywebproxy.cs
- Intellisense.cs
- GridViewHeaderRowPresenter.cs
- Helper.cs
- InputLanguageEventArgs.cs
- UnknownBitmapDecoder.cs
- MultiView.cs
- ChildDocumentBlock.cs
- FileStream.cs
- ObsoleteAttribute.cs
- CultureInfo.cs
- FunctionImportMapping.cs
- UnmanagedMemoryStreamWrapper.cs
- AutomationProperty.cs
- DefaultEventAttribute.cs
- XmlStreamNodeWriter.cs
- GridViewEditEventArgs.cs
- ClusterRegistryConfigurationProvider.cs
- compensatingcollection.cs
- FormViewPageEventArgs.cs
- Dispatcher.cs
- ValidatingPropertiesEventArgs.cs
- SignatureToken.cs
- SqlBulkCopyColumnMapping.cs
- Positioning.cs
- Mutex.cs
- MulticastOption.cs
- SmiMetaDataProperty.cs
- RelatedView.cs
- ProxyHwnd.cs
- ResolveDuplexAsyncResult.cs
- StyleXamlTreeBuilder.cs
- DeviceContexts.cs
- SetterBaseCollection.cs
- ValidatorCollection.cs
- GroupBox.cs
- ImageSourceTypeConverter.cs
- RequestQueryProcessor.cs
- DataServiceHostFactory.cs
- ListParagraph.cs
- EntityStoreSchemaFilterEntry.cs
- EditBehavior.cs
- UserControl.cs
- DataControlFieldCell.cs
- PolicyManager.cs
- ObjectParameter.cs
- SecUtil.cs
- CurrencyWrapper.cs
- GregorianCalendar.cs
- WmlSelectionListAdapter.cs
- XmlDataImplementation.cs
- FormatVersion.cs
- cookiecollection.cs
- OdbcInfoMessageEvent.cs