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
- HttpPostedFile.cs
- typedescriptorpermissionattribute.cs
- SafeFileMapViewHandle.cs
- Transform.cs
- ChangeInterceptorAttribute.cs
- DbProviderConfigurationHandler.cs
- WindowsMenu.cs
- FlowNode.cs
- StickyNoteAnnotations.cs
- ToolStripStatusLabel.cs
- ArraySegment.cs
- WizardPanel.cs
- ExtenderProvidedPropertyAttribute.cs
- TextRangeEditTables.cs
- ServicePointManagerElement.cs
- SqlParameterizer.cs
- ScanQueryOperator.cs
- AssemblyCacheEntry.cs
- CompositeActivityValidator.cs
- StaticExtension.cs
- TemplateKey.cs
- RelationshipConverter.cs
- FontCollection.cs
- HitTestWithPointDrawingContextWalker.cs
- PersonalizationStateInfoCollection.cs
- HandleExceptionArgs.cs
- AuthorizationBehavior.cs
- FormClosingEvent.cs
- DataContractJsonSerializerOperationBehavior.cs
- RegisteredScript.cs
- WsdlImporterElement.cs
- WindowsFormsLinkLabel.cs
- ResolvedKeyFrameEntry.cs
- OutOfProcStateClientManager.cs
- OdbcErrorCollection.cs
- ObjectDataSourceMethodEventArgs.cs
- WebPartsPersonalizationAuthorization.cs
- GeometryHitTestParameters.cs
- DrawingCollection.cs
- Converter.cs
- RoutedEventArgs.cs
- AssociationEndMember.cs
- MSG.cs
- SSmlParser.cs
- HijriCalendar.cs
- HttpHandlersSection.cs
- ParseHttpDate.cs
- StagingAreaInputItem.cs
- PerformanceCounterLib.cs
- SequenceDesigner.cs
- PermissionRequestEvidence.cs
- FileDialogCustomPlacesCollection.cs
- DBSchemaTable.cs
- StringSource.cs
- Brush.cs
- BindingListCollectionView.cs
- ListItemConverter.cs
- HttpListener.cs
- Input.cs
- Profiler.cs
- WindowsToolbarAsMenu.cs
- SpnegoTokenAuthenticator.cs
- CaretElement.cs
- MenuItemCollection.cs
- datacache.cs
- Input.cs
- WithStatement.cs
- CipherData.cs
- MimeMultiPart.cs
- DefaultValueTypeConverter.cs
- PointAnimationBase.cs
- XmlBinaryReader.cs
- XmlCharCheckingReader.cs
- SqlDependencyUtils.cs
- MaxMessageSizeStream.cs
- SmiEventSink.cs
- RequestQueryParser.cs
- CodeRemoveEventStatement.cs
- BindingValueChangedEventArgs.cs
- MessageSecurityProtocol.cs
- WebServiceFaultDesigner.cs
- BamlLocalizationDictionary.cs
- XmlTypeAttribute.cs
- LicenseContext.cs
- StateRuntime.cs
- AuthenticationModulesSection.cs
- FixedHighlight.cs
- MouseDevice.cs
- RadialGradientBrush.cs
- Pen.cs
- DateTimePicker.cs
- mediapermission.cs
- ObjectParameterCollection.cs
- embossbitmapeffect.cs
- SingleAnimation.cs
- PropertyEmitterBase.cs
- ClockGroup.cs
- ProcessHostServerConfig.cs
- Page.cs
- PointCollection.cs