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
- PhotoPrintingIntent.cs
- TextEditorSelection.cs
- Choices.cs
- SessionStateSection.cs
- TabItem.cs
- NameValuePermission.cs
- OdbcInfoMessageEvent.cs
- TreeNodeStyleCollection.cs
- MailWriter.cs
- Ipv6Element.cs
- ToolStripTextBox.cs
- ConstraintStruct.cs
- WebPartAddingEventArgs.cs
- WmlImageAdapter.cs
- HandlerFactoryCache.cs
- XmlEntityReference.cs
- iisPickupDirectory.cs
- Size3D.cs
- SmiSettersStream.cs
- Function.cs
- COM2PropertyPageUITypeConverter.cs
- DateTimePicker.cs
- PagesChangedEventArgs.cs
- BlurEffect.cs
- ClientTargetSection.cs
- StopStoryboard.cs
- CachedFontFace.cs
- RowSpanVector.cs
- ArraySortHelper.cs
- CompositeDispatchFormatter.cs
- ScriptingAuthenticationServiceSection.cs
- ListBindingHelper.cs
- ConfigXmlText.cs
- embossbitmapeffect.cs
- Canvas.cs
- StringValidatorAttribute.cs
- SafeProcessHandle.cs
- TransformerConfigurationWizardBase.cs
- TableLayoutStyleCollection.cs
- BasicSecurityProfileVersion.cs
- CellParaClient.cs
- wpf-etw.cs
- LookupNode.cs
- ArithmeticException.cs
- FlowLayoutSettings.cs
- TextServicesCompartmentContext.cs
- WebPartConnectionsDisconnectVerb.cs
- EntityDataSourceDesigner.cs
- CompensatableTransactionScopeActivity.cs
- MasterPageCodeDomTreeGenerator.cs
- ParseNumbers.cs
- DropDownList.cs
- Utils.cs
- AnonymousIdentificationSection.cs
- ServiceNotStartedException.cs
- TimeZoneNotFoundException.cs
- RegisterInfo.cs
- CapabilitiesSection.cs
- BitmapPalettes.cs
- DataGridLinkButton.cs
- DataGridViewRowConverter.cs
- InertiaTranslationBehavior.cs
- ExtensionQuery.cs
- SafePEFileHandle.cs
- RTLAwareMessageBox.cs
- MachineKeySection.cs
- DecodeHelper.cs
- ObjectPersistData.cs
- ConditionCollection.cs
- RowToParametersTransformer.cs
- TextBoxBase.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- DesignTimeSiteMapProvider.cs
- SystemKeyConverter.cs
- VerificationException.cs
- MailWebEventProvider.cs
- PointCollection.cs
- DatasetMethodGenerator.cs
- BitmapScalingModeValidation.cs
- PLINQETWProvider.cs
- StylusPlugInCollection.cs
- XmlDictionaryReader.cs
- DataControlPagerLinkButton.cs
- SafeFileMappingHandle.cs
- HttpCapabilitiesSectionHandler.cs
- IApplicationTrustManager.cs
- ObjectListDesigner.cs
- BitmapDecoder.cs
- RawTextInputReport.cs
- COM2Enum.cs
- Polyline.cs
- TextRunProperties.cs
- CaseKeyBox.ViewModel.cs
- XmlMemberMapping.cs
- HwndKeyboardInputProvider.cs
- QilGenerator.cs
- CodeLabeledStatement.cs
- DecoderReplacementFallback.cs
- HitTestDrawingContextWalker.cs
- SizeAnimationClockResource.cs