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
- CheckPair.cs
- SwitchDesigner.xaml.cs
- Rules.cs
- Profiler.cs
- WindowsRegion.cs
- FieldInfo.cs
- NumberAction.cs
- ClassicBorderDecorator.cs
- ReaderContextStackData.cs
- RegexBoyerMoore.cs
- GeneralTransform.cs
- DatagramAdapter.cs
- DataGridViewRowPostPaintEventArgs.cs
- DecimalAnimationBase.cs
- FormsAuthenticationEventArgs.cs
- GPStream.cs
- Expressions.cs
- DetailsViewCommandEventArgs.cs
- VarRemapper.cs
- InlineUIContainer.cs
- WsatConfiguration.cs
- ExecutionContext.cs
- HtmlTableRowCollection.cs
- SocketAddress.cs
- ToolStripPanelSelectionGlyph.cs
- BulletChrome.cs
- BrowserCapabilitiesCodeGenerator.cs
- ConfigXmlElement.cs
- WebPartEditorApplyVerb.cs
- HandleRef.cs
- RequestQueue.cs
- Cursors.cs
- unitconverter.cs
- MasterPageCodeDomTreeGenerator.cs
- elementinformation.cs
- TokenCreationException.cs
- CallbackHandler.cs
- TrackingMemoryStreamFactory.cs
- ExceptionWrapper.cs
- ControlPropertyNameConverter.cs
- Utils.cs
- TransformedBitmap.cs
- SqlCacheDependencyDatabase.cs
- TabletDevice.cs
- RubberbandSelector.cs
- CodeTryCatchFinallyStatement.cs
- _NestedMultipleAsyncResult.cs
- SqlMethods.cs
- FormViewDeletedEventArgs.cs
- HashMembershipCondition.cs
- RadioButton.cs
- MetadataPropertyvalue.cs
- DynamicObject.cs
- SystemBrushes.cs
- PipelineModuleStepContainer.cs
- RuntimeConfigLKG.cs
- UnitySerializationHolder.cs
- ProjectionNode.cs
- TableCellCollection.cs
- NameValueConfigurationCollection.cs
- SelectionManager.cs
- CharAnimationUsingKeyFrames.cs
- XmlWrappingReader.cs
- TagPrefixCollection.cs
- _SSPIWrapper.cs
- RectangleGeometry.cs
- IsolatedStorageFileStream.cs
- RawAppCommandInputReport.cs
- ValueUtilsSmi.cs
- RangeExpression.cs
- ContextQuery.cs
- Encoding.cs
- PageThemeParser.cs
- FileIOPermission.cs
- SchemaInfo.cs
- EntitySqlQueryState.cs
- EntityViewGenerator.cs
- PackagePart.cs
- ObjectRef.cs
- PolyBezierSegment.cs
- SafeNativeMethods.cs
- StartUpEventArgs.cs
- TypeValidationEventArgs.cs
- keycontainerpermission.cs
- ValueQuery.cs
- TraceContextRecord.cs
- AtomicFile.cs
- TextEffectResolver.cs
- PenContexts.cs
- PersonalizationDictionary.cs
- ProcessingInstructionAction.cs
- TextLineBreak.cs
- AliasGenerator.cs
- DataColumn.cs
- WsatTransactionInfo.cs
- IPEndPoint.cs
- HttpChannelFactory.cs
- DoubleLinkListEnumerator.cs
- ActivityLocationReferenceEnvironment.cs
- SimpleColumnProvider.cs