Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- ItemContainerGenerator.cs
- BuildProviderCollection.cs
- DataGridViewCellCancelEventArgs.cs
- ProxyWebPart.cs
- ArrayList.cs
- GregorianCalendarHelper.cs
- RectangleF.cs
- storepermissionattribute.cs
- CapabilitiesSection.cs
- EncryptedPackage.cs
- login.cs
- AliasExpr.cs
- Hyperlink.cs
- ActivityExecutorSurrogate.cs
- Normalizer.cs
- HitTestDrawingContextWalker.cs
- ThreadAttributes.cs
- EnumConverter.cs
- LocalValueEnumerator.cs
- DataGridViewColumnCollection.cs
- _NetworkingPerfCounters.cs
- XmlSchemaCompilationSettings.cs
- CustomValidator.cs
- ProfileEventArgs.cs
- HTTPNotFoundHandler.cs
- TransformedBitmap.cs
- StrokeFIndices.cs
- ImmComposition.cs
- TableAutomationPeer.cs
- Baml6Assembly.cs
- CriticalExceptions.cs
- HierarchicalDataBoundControlAdapter.cs
- SspiNegotiationTokenAuthenticator.cs
- DynamicUpdateCommand.cs
- WebHttpEndpoint.cs
- FixedTextSelectionProcessor.cs
- ColumnHeader.cs
- Converter.cs
- COM2ColorConverter.cs
- processwaithandle.cs
- Visual3D.cs
- TextAdaptor.cs
- DataRowCollection.cs
- DrawingContextFlattener.cs
- DataColumnMapping.cs
- UserControl.cs
- CodeExporter.cs
- InvalidDataException.cs
- XmlElementElement.cs
- MarkupCompilePass2.cs
- TextTreeRootNode.cs
- OleDbWrapper.cs
- OperationAbortedException.cs
- TypeValidationEventArgs.cs
- CodeDirectionExpression.cs
- DesignerForm.cs
- UIAgentAsyncEndRequest.cs
- ToolboxItemCollection.cs
- TransformedBitmap.cs
- ErrorWrapper.cs
- MetadataSource.cs
- ScriptReferenceEventArgs.cs
- MaterialCollection.cs
- Utils.cs
- SettingsSavedEventArgs.cs
- TaiwanCalendar.cs
- ToolStripItemImageRenderEventArgs.cs
- OdbcStatementHandle.cs
- LeaseManager.cs
- RunClient.cs
- WebPartDisplayMode.cs
- DescendentsWalker.cs
- StyleConverter.cs
- TypedReference.cs
- XPathNode.cs
- SqlExpander.cs
- BamlResourceSerializer.cs
- ApplicationServiceManager.cs
- IpcClientChannel.cs
- DelayedRegex.cs
- XmlTextWriter.cs
- AuthorizationRuleCollection.cs
- RawStylusInput.cs
- ChannelTraceRecord.cs
- WebPartTransformer.cs
- Stream.cs
- EditingScope.cs
- WebMethodAttribute.cs
- ServiceContractGenerator.cs
- NavigationPropertyAccessor.cs
- Crc32Helper.cs
- XmlSchemaImport.cs
- UpdateException.cs
- WebErrorHandler.cs
- FontEmbeddingManager.cs
- Assert.cs
- SqlDataReaderSmi.cs
- PeerContact.cs
- BooleanFunctions.cs
- Opcode.cs