Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- SQlBooleanStorage.cs
- PointCollectionConverter.cs
- ClassValidator.cs
- StateMachineWorkflow.cs
- WindowCollection.cs
- CodeAttributeArgumentCollection.cs
- ProgressBarRenderer.cs
- validation.cs
- DataSetUtil.cs
- Directory.cs
- ConnectivityStatus.cs
- ThreadLocal.cs
- ChangeConflicts.cs
- RoutedEventArgs.cs
- ValidationRule.cs
- FramingFormat.cs
- CollectionView.cs
- InvokeMethodActivityDesigner.cs
- ManifestSignedXml.cs
- PackageDigitalSignatureManager.cs
- CreateUserWizardStep.cs
- OleDbCommandBuilder.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- BinaryKeyIdentifierClause.cs
- XmlTextEncoder.cs
- ProxyGenerationError.cs
- EventTrigger.cs
- XmlSortKeyAccumulator.cs
- LocalValueEnumerator.cs
- UnSafeCharBuffer.cs
- RijndaelCryptoServiceProvider.cs
- _SafeNetHandles.cs
- HiddenFieldPageStatePersister.cs
- HandlerMappingMemo.cs
- PageStatePersister.cs
- COM2TypeInfoProcessor.cs
- MsmqIntegrationBindingElement.cs
- OrderByBuilder.cs
- RemotingConfiguration.cs
- ItemContainerPattern.cs
- DataShape.cs
- HyperLinkStyle.cs
- WebZoneDesigner.cs
- EventProxy.cs
- WindowsListBox.cs
- GeneralTransform3DCollection.cs
- StrokeNodeOperations2.cs
- Psha1DerivedKeyGeneratorHelper.cs
- SqlCacheDependencyDatabase.cs
- CultureNotFoundException.cs
- Event.cs
- EntityConnectionStringBuilder.cs
- ActionFrame.cs
- Vector3DConverter.cs
- XPathArrayIterator.cs
- WebPartHelpVerb.cs
- XmlQueryCardinality.cs
- WhileDesigner.xaml.cs
- Underline.cs
- ReadOnlyPropertyMetadata.cs
- MessageHeaderInfoTraceRecord.cs
- ClientBuildManagerCallback.cs
- OperationBehaviorAttribute.cs
- PiiTraceSource.cs
- PointHitTestResult.cs
- validationstate.cs
- MetadataSource.cs
- MouseBinding.cs
- Int32CAMarshaler.cs
- _ShellExpression.cs
- DataGridItemEventArgs.cs
- ConstraintConverter.cs
- AccessDataSource.cs
- CodeTypeParameterCollection.cs
- ProvidePropertyAttribute.cs
- EntityDataSourceQueryBuilder.cs
- Model3D.cs
- BrowserTree.cs
- InvokeGenerator.cs
- Selector.cs
- AttachmentCollection.cs
- TypefaceMetricsCache.cs
- TextFormatter.cs
- RowToParametersTransformer.cs
- GridViewUpdateEventArgs.cs
- BackgroundWorker.cs
- StylesEditorDialog.cs
- LogicalChannel.cs
- FirstMatchCodeGroup.cs
- AddInDeploymentState.cs
- EqualityComparer.cs
- SplitterCancelEvent.cs
- DynamicDataManager.cs
- ToolStripPanelRow.cs
- Transform.cs
- Types.cs
- EncodingDataItem.cs
- Boolean.cs
- AdCreatedEventArgs.cs
- DecimalAverageAggregationOperator.cs