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
- ObjectPersistData.cs
- InkCanvas.cs
- HostVisual.cs
- DiagnosticTrace.cs
- TrackingServices.cs
- NavigationService.cs
- DelimitedListTraceListener.cs
- StackSpiller.Bindings.cs
- ArrayConverter.cs
- EditorPartCollection.cs
- OutputCacheModule.cs
- StrokeCollection2.cs
- InkPresenterAutomationPeer.cs
- XmlDataSourceView.cs
- Transform3DGroup.cs
- ToolboxItem.cs
- FileRecordSequenceCompletedAsyncResult.cs
- InstancePersistenceException.cs
- X509Certificate.cs
- SupportsEventValidationAttribute.cs
- CatalogZone.cs
- ApplicationContext.cs
- QueryOptionExpression.cs
- RectangleHotSpot.cs
- WaitHandleCannotBeOpenedException.cs
- Preprocessor.cs
- FigureHelper.cs
- ControlParser.cs
- Comparer.cs
- SurrogateEncoder.cs
- RuleAttributes.cs
- ExtendedProperty.cs
- TemplateBuilder.cs
- SignatureGenerator.cs
- httpstaticobjectscollection.cs
- CanonicalXml.cs
- NonNullItemCollection.cs
- SizeAnimationUsingKeyFrames.cs
- EntryPointNotFoundException.cs
- FunctionNode.cs
- StateMachine.cs
- Serializer.cs
- DbConnectionPoolGroupProviderInfo.cs
- RectangleConverter.cs
- NonParentingControl.cs
- MemberDescriptor.cs
- PointLightBase.cs
- SocketPermission.cs
- Utility.cs
- ApplicationCommands.cs
- WebConfigurationHostFileChange.cs
- GlyphCache.cs
- TableRow.cs
- Mapping.cs
- PropertyAccessVisitor.cs
- XmlImplementation.cs
- PatternMatchRules.cs
- MatrixCamera.cs
- StylusPointCollection.cs
- TableLayoutCellPaintEventArgs.cs
- XmlSchemaExternal.cs
- DomainLiteralReader.cs
- ScriptReferenceEventArgs.cs
- MenuRenderer.cs
- SecurityHelper.cs
- NavigationProgressEventArgs.cs
- EventMap.cs
- PartialTrustHelpers.cs
- TraceHelpers.cs
- Number.cs
- Line.cs
- Action.cs
- TaskFileService.cs
- validationstate.cs
- path.cs
- BackEase.cs
- RSAOAEPKeyExchangeDeformatter.cs
- SerializationInfo.cs
- SelectedDatesCollection.cs
- DataListItemEventArgs.cs
- ProviderException.cs
- UIPermission.cs
- SqlBinder.cs
- FieldNameLookup.cs
- BordersPage.cs
- SrgsDocumentParser.cs
- MetadataItem_Static.cs
- Application.cs
- DefaultTraceListener.cs
- ChannelParameterCollection.cs
- Parser.cs
- XPathSingletonIterator.cs
- PipelineDeploymentState.cs
- CodeExpressionCollection.cs
- PeerNameRegistration.cs
- MethodBuilder.cs
- ImageListUtils.cs
- MonthCalendar.cs
- JavaScriptObjectDeserializer.cs
- DateTimeUtil.cs