Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- DbParameterCollection.cs
- GridEntry.cs
- XMLSchema.cs
- PenLineJoinValidation.cs
- XmlAggregates.cs
- RoleManagerSection.cs
- SafeFileMapViewHandle.cs
- LocalizableResourceBuilder.cs
- BitmapFrameDecode.cs
- PointValueSerializer.cs
- Processor.cs
- GACIdentityPermission.cs
- Quaternion.cs
- WindowsGraphicsCacheManager.cs
- ColorMap.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- WorkflowRuntimeElement.cs
- SortDescriptionCollection.cs
- Mutex.cs
- Size3D.cs
- Int32.cs
- PostBackTrigger.cs
- SafeReadContext.cs
- RegistrationServices.cs
- ProxyWebPartManager.cs
- Variant.cs
- RbTree.cs
- ThicknessAnimationBase.cs
- CookielessHelper.cs
- WindowHelperService.cs
- CanExecuteRoutedEventArgs.cs
- OdbcError.cs
- DockAndAnchorLayout.cs
- Evaluator.cs
- HandleExceptionArgs.cs
- InitializingNewItemEventArgs.cs
- SimpleWorkerRequest.cs
- OleDbStruct.cs
- SoapInteropTypes.cs
- DataColumnChangeEvent.cs
- DocComment.cs
- WindowsListViewGroupSubsetLink.cs
- UnlockCardRequest.cs
- UnsafeNativeMethods.cs
- CellPartitioner.cs
- CheckBoxList.cs
- ListComponentEditor.cs
- NamespaceEmitter.cs
- DesignTimeVisibleAttribute.cs
- Crypto.cs
- PrintingPermission.cs
- InkPresenterAutomationPeer.cs
- _CommandStream.cs
- WebPartConnectionsEventArgs.cs
- WebExceptionStatus.cs
- ContextProperty.cs
- DataRowCollection.cs
- IPGlobalProperties.cs
- BasePattern.cs
- XmlDataProvider.cs
- FormViewInsertedEventArgs.cs
- WebPartUtil.cs
- AuthenticationService.cs
- TypeLibConverter.cs
- OutputBuffer.cs
- WindowCollection.cs
- DataGridViewCell.cs
- DocumentsTrace.cs
- PropertyDescriptorCollection.cs
- ZoneMembershipCondition.cs
- ReaderOutput.cs
- SpinWait.cs
- PrintEvent.cs
- TagMapInfo.cs
- SurrogateSelector.cs
- SymDocumentType.cs
- XmlArrayItemAttribute.cs
- SqlCommand.cs
- AssemblyInfo.cs
- SortedDictionary.cs
- ComponentResourceManager.cs
- UserPreferenceChangedEventArgs.cs
- ToolStripOverflowButton.cs
- ArgumentValueSerializer.cs
- AsyncPostBackTrigger.cs
- MatcherBuilder.cs
- WindowsSolidBrush.cs
- FragmentQuery.cs
- EventLogTraceListener.cs
- ResourceLoader.cs
- InheritanceRules.cs
- ThemeableAttribute.cs
- BoolExpressionVisitors.cs
- TaiwanLunisolarCalendar.cs
- HtmlShimManager.cs
- RadioButton.cs
- NativeMethods.cs
- Root.cs
- MenuItemBindingCollection.cs
- MgmtConfigurationRecord.cs