Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- PerformanceCounterPermission.cs
- Compiler.cs
- ReflectionHelper.cs
- WindowClosedEventArgs.cs
- ChildTable.cs
- RuleEngine.cs
- TaskHelper.cs
- UpdateCompiler.cs
- SizeFConverter.cs
- CodeTypeReferenceCollection.cs
- GlyphRunDrawing.cs
- SmiRecordBuffer.cs
- JsonReaderDelegator.cs
- MetadataUtilsSmi.cs
- ButtonBaseAdapter.cs
- ObjectTag.cs
- AspCompat.cs
- XslCompiledTransform.cs
- DependencyPropertyAttribute.cs
- AvTraceDetails.cs
- RepeatButton.cs
- StorageScalarPropertyMapping.cs
- PagePropertiesChangingEventArgs.cs
- TypeDescriptionProviderAttribute.cs
- ValidateNames.cs
- ProvidePropertyAttribute.cs
- SoapSchemaExporter.cs
- TextServicesManager.cs
- ChannelManager.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- RenderOptions.cs
- CollectionViewGroupRoot.cs
- XPathExpr.cs
- BamlRecordReader.cs
- InputReport.cs
- StringOutput.cs
- HttpDictionary.cs
- JavaScriptString.cs
- RoutingSection.cs
- _IPv4Address.cs
- securitycriticaldataClass.cs
- HwndSourceParameters.cs
- ColorMap.cs
- FamilyCollection.cs
- NativeMethods.cs
- StateWorkerRequest.cs
- HwndMouseInputProvider.cs
- ProfileWorkflowElement.cs
- HttpPostedFile.cs
- FactoryId.cs
- BaseCodePageEncoding.cs
- ScriptReference.cs
- Byte.cs
- FontWeightConverter.cs
- XmlLoader.cs
- CriticalExceptions.cs
- CorrelationExtension.cs
- DocumentSequence.cs
- SecUtil.cs
- GroupStyle.cs
- TextBoxDesigner.cs
- PermissionAttributes.cs
- InstanceOwner.cs
- AutoGeneratedField.cs
- TextEditorParagraphs.cs
- StringPropertyBuilder.cs
- ControlFilterExpression.cs
- AppSecurityManager.cs
- COM2IManagedPerPropertyBrowsingHandler.cs
- PointCollection.cs
- PropertyChange.cs
- loginstatus.cs
- EventDrivenDesigner.cs
- BaseTemplateParser.cs
- LoadRetryAsyncResult.cs
- BamlBinaryReader.cs
- DefaultTraceListener.cs
- GridViewEditEventArgs.cs
- ModelItem.cs
- CodeDelegateCreateExpression.cs
- DataGridViewCellFormattingEventArgs.cs
- ExternalDataExchangeService.cs
- EmptyEnumerable.cs
- CodeIterationStatement.cs
- DataGridViewAutoSizeModeEventArgs.cs
- MexHttpBindingElement.cs
- XPathSelfQuery.cs
- GeneratedView.cs
- UnitySerializationHolder.cs
- DefaultSerializationProviderAttribute.cs
- Link.cs
- StructuredTypeEmitter.cs
- XpsImage.cs
- _PooledStream.cs
- safesecurityhelperavalon.cs
- TrustLevel.cs
- validationstate.cs
- WebSysDescriptionAttribute.cs
- WebPartConnection.cs
- OpacityConverter.cs