Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- WebServiceEnumData.cs
- PerfCounters.cs
- XPathDocumentNavigator.cs
- DesignTimeData.cs
- ByteBufferPool.cs
- ConnectionManagementElementCollection.cs
- ReliableOutputSessionChannel.cs
- ComNativeDescriptor.cs
- Point4D.cs
- XmlSchemaComplexContentExtension.cs
- RemoteWebConfigurationHostStream.cs
- InkCanvas.cs
- StreamHelper.cs
- WindowsAuthenticationModule.cs
- WebPartManagerInternals.cs
- StatusBarItem.cs
- SafePEFileHandle.cs
- FtpRequestCacheValidator.cs
- RangeValueProviderWrapper.cs
- QueueProcessor.cs
- SocketManager.cs
- QueryExpr.cs
- SortedList.cs
- KeyNotFoundException.cs
- RawStylusInputCustomDataList.cs
- WebPartTracker.cs
- MetadataArtifactLoaderResource.cs
- ReachDocumentReferenceSerializer.cs
- XmlWhitespace.cs
- DbConnectionPoolOptions.cs
- PartialArray.cs
- DashStyles.cs
- util.cs
- CollectionDataContractAttribute.cs
- TextContainerChangedEventArgs.cs
- DataGridViewLayoutData.cs
- SQLGuid.cs
- wmiprovider.cs
- SchemaHelper.cs
- WebContext.cs
- TypeExtensionConverter.cs
- SQLSingle.cs
- DataContractSerializer.cs
- ThreadStartException.cs
- BufferedReadStream.cs
- XmlILModule.cs
- DataGridViewColumnCollection.cs
- RulePatternOps.cs
- ObjectMemberMapping.cs
- GenerateScriptTypeAttribute.cs
- StreamGeometry.cs
- DecoderReplacementFallback.cs
- ErasingStroke.cs
- XhtmlBasicListAdapter.cs
- MemberDescriptor.cs
- EdmEntityTypeAttribute.cs
- InkCanvasSelectionAdorner.cs
- ManualResetEvent.cs
- EdmToObjectNamespaceMap.cs
- LinkTarget.cs
- DataSetMappper.cs
- ExternalFile.cs
- EditCommandColumn.cs
- DataGridItemCollection.cs
- Documentation.cs
- ChameleonKey.cs
- DataBindingList.cs
- ObjectViewFactory.cs
- DesignerSerializationVisibilityAttribute.cs
- ObjectContextServiceProvider.cs
- CultureSpecificCharacterBufferRange.cs
- XmlDomTextWriter.cs
- OutputScopeManager.cs
- TimeManager.cs
- Journal.cs
- Stroke.cs
- SymbolTable.cs
- TabletDevice.cs
- HierarchicalDataSourceControl.cs
- EndpointIdentityExtension.cs
- CodeDOMUtility.cs
- URLEditor.cs
- UrlAuthorizationModule.cs
- EventSourceCreationData.cs
- MulticastIPAddressInformationCollection.cs
- SqlNotificationEventArgs.cs
- NumericUpDownAcceleration.cs
- ItemContainerProviderWrapper.cs
- RouteData.cs
- StaticExtension.cs
- XmlSerializationWriter.cs
- ScriptControlDescriptor.cs
- SystemFonts.cs
- ApplicationDirectory.cs
- LicenseException.cs
- RetriableClipboard.cs
- AssemblyCollection.cs
- ReflectPropertyDescriptor.cs
- TableLayoutPanel.cs
- AspNetHostingPermission.cs