Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PerformanceCounterPermissionEntry.cs
- StylusShape.cs
- HwndKeyboardInputProvider.cs
- SecureConversationServiceCredential.cs
- ContentControl.cs
- IdleTimeoutMonitor.cs
- LinqDataSourceView.cs
- CellCreator.cs
- DatasetMethodGenerator.cs
- FontSourceCollection.cs
- Int32RectValueSerializer.cs
- MetadataPropertyAttribute.cs
- XmlDataDocument.cs
- SpoolingTaskBase.cs
- RegexWorker.cs
- AppDomainResourcePerfCounters.cs
- UnsafeNetInfoNativeMethods.cs
- SqlCacheDependencyDatabase.cs
- mediaeventargs.cs
- WebPartZoneBase.cs
- CounterCreationDataCollection.cs
- MarshalByRefObject.cs
- XmlUtil.cs
- RichTextBoxConstants.cs
- RequestSecurityToken.cs
- PasswordDeriveBytes.cs
- StoryFragments.cs
- GiveFeedbackEventArgs.cs
- TripleDES.cs
- WebPartTransformerAttribute.cs
- Point4DValueSerializer.cs
- ReferenceConverter.cs
- HttpCacheParams.cs
- ControlCollection.cs
- XPathSelectionIterator.cs
- SerTrace.cs
- HtmlInputFile.cs
- SaveFileDialog.cs
- ClientFormsIdentity.cs
- DataViewSetting.cs
- BuilderInfo.cs
- AsyncOperationManager.cs
- ChtmlTextWriter.cs
- ContainerTracking.cs
- QuadraticBezierSegment.cs
- FacetEnabledSchemaElement.cs
- PrintDialog.cs
- SoapFormatExtensions.cs
- ConnectionPointCookie.cs
- DataIdProcessor.cs
- MatrixIndependentAnimationStorage.cs
- TableFieldsEditor.cs
- HttpRuntime.cs
- RuntimeConfigLKG.cs
- MultiTrigger.cs
- ServiceModelConfiguration.cs
- BasicExpressionVisitor.cs
- ActivityTypeResolver.xaml.cs
- JsonDataContract.cs
- Type.cs
- ConnectionInterfaceCollection.cs
- XmlNamespaceManager.cs
- HtmlHead.cs
- BitmapSourceSafeMILHandle.cs
- ClientSideProviderDescription.cs
- PersonalizationProviderCollection.cs
- ThreadStaticAttribute.cs
- HttpHeaderCollection.cs
- Size.cs
- LayoutSettings.cs
- RegionIterator.cs
- CodeTypeMember.cs
- AuthorizationSection.cs
- ChannelCacheDefaults.cs
- AbsoluteQuery.cs
- InternalRelationshipCollection.cs
- CallTemplateAction.cs
- CodeNamespaceCollection.cs
- TdsRecordBufferSetter.cs
- Encoder.cs
- CustomErrorCollection.cs
- ZipIOLocalFileDataDescriptor.cs
- UnsafeNetInfoNativeMethods.cs
- CodeNamespaceCollection.cs
- ChannelServices.cs
- BitmapScalingModeValidation.cs
- AssemblyBuilder.cs
- AuthorizationSection.cs
- BaseCollection.cs
- ObjectReaderCompiler.cs
- KeyEvent.cs
- DbProviderFactories.cs
- TextDecorationCollection.cs
- MaterialCollection.cs
- Converter.cs
- PropertyItemInternal.cs
- selecteditemcollection.cs
- SQLCharsStorage.cs
- EntityConnectionStringBuilder.cs
- NumericUpDownAccelerationCollection.cs