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
- UrlMappingCollection.cs
- SurrogateDataContract.cs
- SHA512Managed.cs
- LabelEditEvent.cs
- CompensableActivity.cs
- Relationship.cs
- TabRenderer.cs
- XmlCharacterData.cs
- HostingMessageProperty.cs
- ScalarConstant.cs
- SqlProviderUtilities.cs
- BuiltInExpr.cs
- CTreeGenerator.cs
- newitemfactory.cs
- ArraySet.cs
- FragmentQueryKB.cs
- FixedDSBuilder.cs
- MostlySingletonList.cs
- StateBag.cs
- SortedDictionary.cs
- InternalControlCollection.cs
- XmlNamedNodeMap.cs
- NavigateEvent.cs
- IconHelper.cs
- JoinElimination.cs
- CodePageUtils.cs
- BypassElementCollection.cs
- ResourceDescriptionAttribute.cs
- RayMeshGeometry3DHitTestResult.cs
- TextRangeEditTables.cs
- KeyGestureConverter.cs
- PropertyMapper.cs
- WebPartEventArgs.cs
- CommandDevice.cs
- DataTableCollection.cs
- SafeHandles.cs
- FocusChangedEventArgs.cs
- UserMapPath.cs
- JavaScriptString.cs
- ImageListImage.cs
- StreamResourceInfo.cs
- TypeConverterHelper.cs
- ImageKeyConverter.cs
- MemberMaps.cs
- RC2.cs
- ComplexTypeEmitter.cs
- PipeStream.cs
- itemelement.cs
- AuthenticateEventArgs.cs
- StaticResourceExtension.cs
- EnumerableRowCollection.cs
- XPathMessageContext.cs
- EncoderBestFitFallback.cs
- MdiWindowListStrip.cs
- ExtenderControl.cs
- SmtpNtlmAuthenticationModule.cs
- RegionIterator.cs
- BitStack.cs
- TdsRecordBufferSetter.cs
- MenuAdapter.cs
- WebPartConnectionsDisconnectVerb.cs
- MaskedTextProvider.cs
- Deflater.cs
- HttpHandlersInstallComponent.cs
- KeyboardDevice.cs
- TypeConverters.cs
- RectIndependentAnimationStorage.cs
- CaseInsensitiveOrdinalStringComparer.cs
- baseaxisquery.cs
- ServiceNameElement.cs
- SessionIDManager.cs
- CompareInfo.cs
- RawStylusInputCustomData.cs
- XD.cs
- StateManager.cs
- XslException.cs
- BridgeDataRecord.cs
- ExtractedStateEntry.cs
- AttributeEmitter.cs
- FamilyTypeface.cs
- MemberProjectedSlot.cs
- GetWinFXPath.cs
- PageCatalogPart.cs
- CfgArc.cs
- UnsafeNativeMethodsCLR.cs
- BuildResultCache.cs
- Listbox.cs
- SoapSchemaImporter.cs
- ScrollProviderWrapper.cs
- _NestedMultipleAsyncResult.cs
- FileDialogCustomPlace.cs
- Panel.cs
- GetPageCompletedEventArgs.cs
- ClientRoleProvider.cs
- FileVersion.cs
- NavigationProperty.cs
- LicenseException.cs
- SerializationInfoEnumerator.cs
- RuntimeResourceSet.cs
- DetailsViewCommandEventArgs.cs