Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- unsafenativemethodsother.cs
- DependencyPropertyKey.cs
- EntitySet.cs
- UrlMapping.cs
- ComPersistableTypeElementCollection.cs
- WebPartChrome.cs
- InstanceStore.cs
- PropertyTab.cs
- EditingCommands.cs
- MasterPageCodeDomTreeGenerator.cs
- IdnMapping.cs
- EncoderParameters.cs
- DocumentPageViewAutomationPeer.cs
- PersonalizationStateQuery.cs
- ParagraphResult.cs
- ProcessManager.cs
- NullableDoubleAverageAggregationOperator.cs
- DefaultIfEmptyQueryOperator.cs
- Parameter.cs
- SHA512Managed.cs
- Symbol.cs
- DataGridColumnCollection.cs
- Identity.cs
- VectorValueSerializer.cs
- TextEncodedRawTextWriter.cs
- DataControlLinkButton.cs
- EntityDataSourceQueryBuilder.cs
- DiscoveryViaBehavior.cs
- DropDownButton.cs
- SafeProcessHandle.cs
- FastEncoderWindow.cs
- Operand.cs
- PixelFormatConverter.cs
- SemanticValue.cs
- ToolboxItemAttribute.cs
- TypeForwardedFromAttribute.cs
- BypassElement.cs
- TextViewSelectionProcessor.cs
- OdbcRowUpdatingEvent.cs
- RelationshipFixer.cs
- GridViewEditEventArgs.cs
- BookmarkScopeInfo.cs
- LicFileLicenseProvider.cs
- storepermission.cs
- Span.cs
- WebBrowserHelper.cs
- SiteMapPath.cs
- SafeNativeMethods.cs
- GPPOINT.cs
- RelOps.cs
- RootBrowserWindowProxy.cs
- GridViewEditEventArgs.cs
- SoapServerProtocol.cs
- DetailsViewUpdatedEventArgs.cs
- VirtualDirectoryMapping.cs
- XmlProcessingInstruction.cs
- UIElement3D.cs
- VectorConverter.cs
- DocumentProperties.cs
- SqlServices.cs
- BuildProviderAppliesToAttribute.cs
- ZoneLinkButton.cs
- PageCatalogPart.cs
- XPathExpr.cs
- StylusCollection.cs
- TrustLevel.cs
- EntityTypeEmitter.cs
- ListControlActionList.cs
- CqlBlock.cs
- XslException.cs
- SerializationSectionGroup.cs
- SelectionRangeConverter.cs
- TreeBuilder.cs
- FormatSelectingMessageInspector.cs
- Accessors.cs
- WebPartHelpVerb.cs
- CompositeActivityValidator.cs
- HttpCacheParams.cs
- AdjustableArrowCap.cs
- Atom10FeedFormatter.cs
- MembershipValidatePasswordEventArgs.cs
- RepeaterItemEventArgs.cs
- SqlUserDefinedTypeAttribute.cs
- PermissionToken.cs
- unsafenativemethodstextservices.cs
- PolyLineSegmentFigureLogic.cs
- ValuePatternIdentifiers.cs
- StorageSetMapping.cs
- BooleanToVisibilityConverter.cs
- HttpApplicationStateBase.cs
- DBAsyncResult.cs
- SBCSCodePageEncoding.cs
- SoapIgnoreAttribute.cs
- OpCodes.cs
- StrokeNodeData.cs
- BinaryMessageEncoder.cs
- EmptyCollection.cs
- DynamicAttribute.cs
- ObjectStorage.cs
- ITreeGenerator.cs