Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- FlatButtonAppearance.cs
- ConfigXmlCDataSection.cs
- PkcsUtils.cs
- LoadedEvent.cs
- RenamedEventArgs.cs
- WindowsRichEdit.cs
- ProfessionalColors.cs
- Missing.cs
- DefaultHttpHandler.cs
- MsmqTransportSecurityElement.cs
- LinqDataSourceContextData.cs
- PersonalizationStateInfoCollection.cs
- DataGridViewButtonCell.cs
- StreamInfo.cs
- PartialCachingControl.cs
- CopyAction.cs
- TimeSpanConverter.cs
- ServerValidateEventArgs.cs
- WindowProviderWrapper.cs
- MediaCommands.cs
- IntSecurity.cs
- __ComObject.cs
- UnsupportedPolicyOptionsException.cs
- ErrorHandlerModule.cs
- FilterQueryOptionExpression.cs
- securestring.cs
- UserNamePasswordClientCredential.cs
- DropTarget.cs
- DesignerAutoFormatStyle.cs
- FixedSchema.cs
- DeriveBytes.cs
- DirectoryNotFoundException.cs
- DataGridViewCellFormattingEventArgs.cs
- DataGridViewBand.cs
- Enumerable.cs
- BamlStream.cs
- MailHeaderInfo.cs
- ApplicationDirectory.cs
- NgenServicingAttributes.cs
- ReadOnlyDataSourceView.cs
- TimeSpanHelper.cs
- ControlParameter.cs
- TdsRecordBufferSetter.cs
- AnimationLayer.cs
- HexParser.cs
- Style.cs
- webproxy.cs
- ClientEventManager.cs
- RegexGroupCollection.cs
- SecurityContext.cs
- GenerateScriptTypeAttribute.cs
- OleDbReferenceCollection.cs
- XmlCharCheckingWriter.cs
- DataColumnChangeEvent.cs
- DBCSCodePageEncoding.cs
- UIElement.cs
- SignedXml.cs
- _CacheStreams.cs
- StrokeCollection.cs
- HttpCookie.cs
- VectorKeyFrameCollection.cs
- TextServicesCompartment.cs
- StopRoutingHandler.cs
- DataRowView.cs
- oledbmetadatacolumnnames.cs
- ReflectPropertyDescriptor.cs
- Pen.cs
- TextEditorCharacters.cs
- OneOf.cs
- assemblycache.cs
- SmiRequestExecutor.cs
- TaskFormBase.cs
- ObjectResult.cs
- StylusCollection.cs
- XmlSchemaGroupRef.cs
- EmptyEnumerator.cs
- BitmapPalettes.cs
- RenderOptions.cs
- SqlRewriteScalarSubqueries.cs
- ConfigXmlCDataSection.cs
- EventProviderTraceListener.cs
- EnumerableRowCollection.cs
- RelatedCurrencyManager.cs
- UnmanagedMemoryStreamWrapper.cs
- XmlSchemaFacet.cs
- EventPrivateKey.cs
- ConfigurationSectionGroup.cs
- MarkupCompilePass2.cs
- EntityDataSource.cs
- FullTextLine.cs
- FileDialog.cs
- ReferencedCategoriesDocument.cs
- GeometryGroup.cs
- XPathQilFactory.cs
- basenumberconverter.cs
- arclist.cs
- ComplexLine.cs
- Set.cs
- ResourceProperty.cs
- NonSerializedAttribute.cs