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
- ParsedRoute.cs
- TransactionException.cs
- ReadWriteObjectLock.cs
- NumberFormatInfo.cs
- TextSelectionProcessor.cs
- SplitterDesigner.cs
- _NegoState.cs
- DataGridCommandEventArgs.cs
- ReachVisualSerializerAsync.cs
- ToolBarButtonDesigner.cs
- Hashtable.cs
- WebServiceHost.cs
- sitestring.cs
- WebPartEditorCancelVerb.cs
- InfoCardBinaryReader.cs
- DropSourceBehavior.cs
- EntityContainer.cs
- TitleStyle.cs
- EnumMemberAttribute.cs
- StickyNote.cs
- BitmapEffectGroup.cs
- MetadataCollection.cs
- CommandField.cs
- CellRelation.cs
- Bezier.cs
- RepeatButton.cs
- AsyncDataRequest.cs
- SafeHandle.cs
- HMACSHA1.cs
- SafePointer.cs
- ImageField.cs
- WorkflowEnvironment.cs
- ParallelTimeline.cs
- SlipBehavior.cs
- NetTcpSectionData.cs
- XPathQilFactory.cs
- ToolStripPanelDesigner.cs
- TextDecorations.cs
- EntityCommandDefinition.cs
- FileUpload.cs
- HostVisual.cs
- ConstructorExpr.cs
- TypeUtils.cs
- DoubleAverageAggregationOperator.cs
- EventMappingSettings.cs
- KeyTimeConverter.cs
- SoapAttributes.cs
- DataSourceHelper.cs
- MetadataItemEmitter.cs
- HashSetDebugView.cs
- Comparer.cs
- DataTable.cs
- BitmapFrameDecode.cs
- XmlComplianceUtil.cs
- DomainUpDown.cs
- SqlOuterApplyReducer.cs
- StructuralCache.cs
- WebPartEditorOkVerb.cs
- ActivityCodeDomSerializer.cs
- RadialGradientBrush.cs
- ButtonRenderer.cs
- WpfWebRequestHelper.cs
- UserPreferenceChangingEventArgs.cs
- ApplicationActivator.cs
- PropertyTab.cs
- Rss20FeedFormatter.cs
- CryptoProvider.cs
- RectValueSerializer.cs
- SoundPlayer.cs
- InvokerUtil.cs
- initElementDictionary.cs
- ContentPathSegment.cs
- OdbcInfoMessageEvent.cs
- SqlMethodCallConverter.cs
- StringValidatorAttribute.cs
- TimeManager.cs
- PageContentCollection.cs
- CalendarButton.cs
- UpDownBase.cs
- AdCreatedEventArgs.cs
- CqlGenerator.cs
- TextEditorLists.cs
- DbConnectionFactory.cs
- HtmlShim.cs
- IDQuery.cs
- DiscoveryMessageSequenceCD1.cs
- EntityDataReader.cs
- BinaryParser.cs
- XmlSchemaImporter.cs
- LongTypeConverter.cs
- AstTree.cs
- DataGridViewRowPostPaintEventArgs.cs
- InvalidPipelineStoreException.cs
- FilteredDataSetHelper.cs
- EndpointDiscoveryMetadataCD1.cs
- NodeInfo.cs
- XhtmlBasicLiteralTextAdapter.cs
- COSERVERINFO.cs
- SafeRightsManagementQueryHandle.cs
- CompilationLock.cs