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
- TargetInvocationException.cs
- FontDialog.cs
- SafeBitVector32.cs
- ParallelDesigner.cs
- ErrorFormatterPage.cs
- ObjectStateFormatter.cs
- XmlUtilWriter.cs
- SQLSingleStorage.cs
- SqlRemoveConstantOrderBy.cs
- InputMethodStateTypeInfo.cs
- ControlCodeDomSerializer.cs
- MessageHeaders.cs
- DataGridViewLinkCell.cs
- TextOptions.cs
- KeyNotFoundException.cs
- XmlElementAttributes.cs
- MaskDescriptors.cs
- HitTestWithPointDrawingContextWalker.cs
- ScrollEventArgs.cs
- MergeFailedEvent.cs
- PersonalizationAdministration.cs
- Normalization.cs
- PageCatalogPart.cs
- HostProtectionException.cs
- WithStatement.cs
- XamlPoint3DCollectionSerializer.cs
- DataServiceQueryProvider.cs
- HtmlProps.cs
- XmlSchemaAnyAttribute.cs
- StringUtil.cs
- LogAppendAsyncResult.cs
- ReadOnlyDataSource.cs
- MemberHolder.cs
- FilterableData.cs
- ObjectQuery_EntitySqlExtensions.cs
- RuleSettingsCollection.cs
- LicenseContext.cs
- StateItem.cs
- ResourceIDHelper.cs
- DataGridTableCollection.cs
- UserPreferenceChangedEventArgs.cs
- SnapLine.cs
- BrowserCapabilitiesFactory.cs
- SQLByteStorage.cs
- StringConcat.cs
- CodeDefaultValueExpression.cs
- LicFileLicenseProvider.cs
- xdrvalidator.cs
- ServerValidateEventArgs.cs
- UIElementPropertyUndoUnit.cs
- EdmEntityTypeAttribute.cs
- TextMetrics.cs
- HtmlFormWrapper.cs
- SharedPersonalizationStateInfo.cs
- XsdDateTime.cs
- BuilderElements.cs
- RegisteredExpandoAttribute.cs
- DrawListViewColumnHeaderEventArgs.cs
- LongValidatorAttribute.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- ResourceDescriptionAttribute.cs
- ObjectSet.cs
- BitmapCodecInfo.cs
- SystemColorTracker.cs
- Border.cs
- HttpListenerContext.cs
- DesignerAttribute.cs
- PKCS1MaskGenerationMethod.cs
- XpsColorContext.cs
- CodeBinaryOperatorExpression.cs
- TextDecorationCollection.cs
- DataGridViewColumn.cs
- DataTablePropertyDescriptor.cs
- TargetInvocationException.cs
- ProfilePropertySettingsCollection.cs
- PassportPrincipal.cs
- NamespaceMapping.cs
- TickBar.cs
- SqlRowUpdatingEvent.cs
- Transactions.cs
- TableParagraph.cs
- BitmapSourceSafeMILHandle.cs
- HttpConfigurationSystem.cs
- XmlDocument.cs
- RequestBringIntoViewEventArgs.cs
- CodeMemberProperty.cs
- ScrollContentPresenter.cs
- DataGridHyperlinkColumn.cs
- DataGridViewCellEventArgs.cs
- UInt16Converter.cs
- Border.cs
- WebPartConnectionsConnectVerb.cs
- HtmlControlPersistable.cs
- GenericEnumConverter.cs
- DebugHandleTracker.cs
- PasswordDeriveBytes.cs
- EntityModelSchemaGenerator.cs
- SafeHGlobalHandleCritical.cs
- SQLInt64.cs
- CollectionViewSource.cs