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
- HtmlInputFile.cs
- ToolStripTextBox.cs
- MemoryFailPoint.cs
- AppSettingsReader.cs
- HttpProfileBase.cs
- FunctionCommandText.cs
- MemberInfoSerializationHolder.cs
- CodeGotoStatement.cs
- _NTAuthentication.cs
- ProxyWebPart.cs
- CodeCompiler.cs
- DataSourceHelper.cs
- MessageRpc.cs
- Calendar.cs
- InsufficientMemoryException.cs
- WebDisplayNameAttribute.cs
- Identifier.cs
- DataSetViewSchema.cs
- ProgressBarBrushConverter.cs
- TdsParserSafeHandles.cs
- CookieHandler.cs
- ActivityExecutorSurrogate.cs
- AnnotationResourceCollection.cs
- CodeIterationStatement.cs
- ToolStripInSituService.cs
- WindowsEditBox.cs
- MappingMetadataHelper.cs
- TabControlEvent.cs
- ProtocolsSection.cs
- Part.cs
- DataGrid.cs
- DefaultParameterValueAttribute.cs
- PeerNameRegistration.cs
- XmlImplementation.cs
- WindowsListViewItem.cs
- ConfigurationManagerInternal.cs
- HWStack.cs
- VariantWrapper.cs
- WebPartMenuStyle.cs
- ColorConvertedBitmap.cs
- HTTP_SERVICE_CONFIG_URLACL_KEY.cs
- ProtocolsConfigurationEntry.cs
- TemplatePagerField.cs
- TextDecorations.cs
- AttachedPropertyMethodSelector.cs
- ErrorView.xaml.cs
- Icon.cs
- ComplexTypeEmitter.cs
- DesignTable.cs
- printdlgexmarshaler.cs
- BinHexEncoding.cs
- ToolStripPanelRenderEventArgs.cs
- DataGridViewMethods.cs
- AttributeSetAction.cs
- MarshalByValueComponent.cs
- ClientApiGenerator.cs
- Barrier.cs
- LOSFormatter.cs
- MaskDesignerDialog.cs
- ThreadAttributes.cs
- TabControl.cs
- Int16Converter.cs
- StateItem.cs
- processwaithandle.cs
- RealizationContext.cs
- ResetableIterator.cs
- LogLogRecordHeader.cs
- CodeDesigner.cs
- ConfigurationProperty.cs
- BlurBitmapEffect.cs
- SqlXmlStorage.cs
- MemberInfoSerializationHolder.cs
- BaseDataListActionList.cs
- GradientSpreadMethodValidation.cs
- XamlTreeBuilderBamlRecordWriter.cs
- Model3D.cs
- ObjectAnimationUsingKeyFrames.cs
- XmlJsonReader.cs
- SecurityCriticalDataForSet.cs
- Blend.cs
- XPathDescendantIterator.cs
- RuntimeHelpers.cs
- AddressingProperty.cs
- TreeNodeConverter.cs
- Errors.cs
- DocumentOrderComparer.cs
- ToolZone.cs
- DrawingContextDrawingContextWalker.cs
- SafeFileMappingHandle.cs
- ProjectionPathBuilder.cs
- MSAANativeProvider.cs
- XmlSchemaAnnotated.cs
- RouteTable.cs
- DuplicateWaitObjectException.cs
- DesignerCategoryAttribute.cs
- sqlser.cs
- AggregatePushdown.cs
- GroupBox.cs
- PageParser.cs
- Vector3DCollectionConverter.cs