Code:
/ 4.0 / 4.0 / 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. 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
- DesignerForm.cs
- SplitterCancelEvent.cs
- GAC.cs
- AuthenticateEventArgs.cs
- SortQueryOperator.cs
- ListViewUpdatedEventArgs.cs
- InputScope.cs
- FontFaceLayoutInfo.cs
- RoutedEventArgs.cs
- ProtocolsConfiguration.cs
- IssuedTokenClientBehaviorsElementCollection.cs
- SQLSingle.cs
- WinFormsComponentEditor.cs
- ToolStripPanelSelectionBehavior.cs
- EncoderNLS.cs
- InertiaRotationBehavior.cs
- FontFamilyValueSerializer.cs
- SoapAttributeOverrides.cs
- PrimaryKeyTypeConverter.cs
- ErrorStyle.cs
- BuildProviderAppliesToAttribute.cs
- EventManager.cs
- DotExpr.cs
- RequestedSignatureDialog.cs
- LinkClickEvent.cs
- XmlSchemaFacet.cs
- Utils.cs
- ExternalFile.cs
- ProxyElement.cs
- InkSerializer.cs
- ParsedAttributeCollection.cs
- Point4D.cs
- GeneralTransform3DGroup.cs
- DataGridTemplateColumn.cs
- StringWriter.cs
- FixUp.cs
- ListParagraph.cs
- RegionInfo.cs
- AdjustableArrowCap.cs
- DetailsView.cs
- WebBrowserEvent.cs
- Trigger.cs
- FixedSOMTextRun.cs
- DataKey.cs
- COM2ExtendedTypeConverter.cs
- Rotation3DKeyFrameCollection.cs
- BitArray.cs
- CompilerTypeWithParams.cs
- EDesignUtil.cs
- DocumentOrderQuery.cs
- CodeDefaultValueExpression.cs
- ProfessionalColors.cs
- AtomicFile.cs
- ElementsClipboardData.cs
- ItemList.cs
- CommandID.cs
- CodeTypeMemberCollection.cs
- FixedDSBuilder.cs
- dataprotectionpermission.cs
- CompModSwitches.cs
- StringExpressionSet.cs
- DefaultHttpHandler.cs
- OperatingSystem.cs
- HwndSubclass.cs
- GridViewDeletedEventArgs.cs
- MultiPartWriter.cs
- DrawingImage.cs
- SoapExtensionReflector.cs
- TranslateTransform3D.cs
- GestureRecognizer.cs
- DWriteFactory.cs
- Visual3DCollection.cs
- TypeNameParser.cs
- DataGrid.cs
- Schema.cs
- BooleanExpr.cs
- SchemaNotation.cs
- ItemsPanelTemplate.cs
- GeometryConverter.cs
- ValueExpressions.cs
- IconConverter.cs
- SqlColumnizer.cs
- DocumentApplicationJournalEntryEventArgs.cs
- UserUseLicenseDictionaryLoader.cs
- DataPagerFieldItem.cs
- DataSourceCache.cs
- StructuralType.cs
- Wizard.cs
- GenericTypeParameterBuilder.cs
- WmpBitmapDecoder.cs
- BinaryObjectInfo.cs
- UserControl.cs
- ApplicationFileParser.cs
- ConfigXmlSignificantWhitespace.cs
- Number.cs
- PropertyState.cs
- DynamicILGenerator.cs
- InputDevice.cs
- DefaultCompensation.cs
- UrlAuthFailedErrorFormatter.cs