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
- CheckBoxList.cs
- AndAlso.cs
- Gdiplus.cs
- FileDialog_Vista_Interop.cs
- GreenMethods.cs
- WebException.cs
- TextClipboardData.cs
- DSASignatureFormatter.cs
- HashCodeCombiner.cs
- ExpressionPrinter.cs
- FirewallWrapper.cs
- IPAddress.cs
- SessionStateUtil.cs
- HtmlContainerControl.cs
- WebHeaderCollection.cs
- Int64KeyFrameCollection.cs
- TextEffectResolver.cs
- TemplateControlBuildProvider.cs
- NameSpaceExtractor.cs
- DbConnectionPoolIdentity.cs
- CommandBinding.cs
- LinkedList.cs
- Underline.cs
- NameNode.cs
- NetworkInformationPermission.cs
- MobileComponentEditorPage.cs
- TerminatorSinks.cs
- DetailsViewDeleteEventArgs.cs
- AttachedPropertyBrowsableAttribute.cs
- DataGridViewColumnCollection.cs
- RadioButton.cs
- EventMappingSettingsCollection.cs
- KnownIds.cs
- GradientSpreadMethodValidation.cs
- EventBookmark.cs
- TemplateInstanceAttribute.cs
- TextEndOfLine.cs
- TcpActivation.cs
- ColumnClickEvent.cs
- StorageTypeMapping.cs
- safemediahandle.cs
- XmlUtilWriter.cs
- FullTrustAssemblyCollection.cs
- Dictionary.cs
- TextCharacters.cs
- XmlException.cs
- RadioButtonRenderer.cs
- CursorConverter.cs
- HttpModuleCollection.cs
- DesignerActionList.cs
- ICollection.cs
- HttpApplication.cs
- MemberProjectedSlot.cs
- ModuleElement.cs
- XamlTypeMapperSchemaContext.cs
- StylusShape.cs
- MouseButtonEventArgs.cs
- TextAnchor.cs
- SystemIPGlobalProperties.cs
- RowSpanVector.cs
- WorkBatch.cs
- TemplateInstanceAttribute.cs
- ReferenceSchema.cs
- CollectionDataContractAttribute.cs
- NumberSubstitution.cs
- TrackingValidationObjectDictionary.cs
- CqlIdentifiers.cs
- ConfigurationSchemaErrors.cs
- Rect3DValueSerializer.cs
- DataServiceHost.cs
- CommandField.cs
- WeakEventTable.cs
- SuppressMessageAttribute.cs
- NullRuntimeConfig.cs
- ToolStripRendererSwitcher.cs
- RoutingChannelExtension.cs
- ReflectTypeDescriptionProvider.cs
- XslCompiledTransform.cs
- Stroke.cs
- GlyphRunDrawing.cs
- LogicalExpr.cs
- NullableDoubleAverageAggregationOperator.cs
- ViewKeyConstraint.cs
- EmptyReadOnlyDictionaryInternal.cs
- DynamicILGenerator.cs
- UsernameTokenFactoryCredential.cs
- PageEventArgs.cs
- SqlDataSourceEnumerator.cs
- UriTemplateVariablePathSegment.cs
- ProfileSection.cs
- DescendentsWalker.cs
- QueryOptionExpression.cs
- XmlIncludeAttribute.cs
- BamlTreeNode.cs
- CapabilitiesAssignment.cs
- ContextBase.cs
- ControlCollection.cs
- EntityDataSourceWizardForm.cs
- Bitmap.cs
- PipeStream.cs