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
- JoinCqlBlock.cs
- TimeIntervalCollection.cs
- EndpointDiscoveryMetadataCD1.cs
- CounterSetInstance.cs
- StatusCommandUI.cs
- WebDisplayNameAttribute.cs
- Size.cs
- SqlRowUpdatingEvent.cs
- TextAction.cs
- NavigatingCancelEventArgs.cs
- SqlProfileProvider.cs
- CharKeyFrameCollection.cs
- ItemsControlAutomationPeer.cs
- DbSource.cs
- DataStreamFromComStream.cs
- CrossSiteScriptingValidation.cs
- TimeStampChecker.cs
- TableProvider.cs
- SQLStringStorage.cs
- UniqueIdentifierService.cs
- DataGridViewRowCollection.cs
- TreeChangeInfo.cs
- LinqDataSource.cs
- PreservationFileWriter.cs
- Substitution.cs
- ObjectListCommandsPage.cs
- CalendarAutoFormat.cs
- CssTextWriter.cs
- SqlMethodAttribute.cs
- MailMessage.cs
- wgx_commands.cs
- UnmanagedMemoryAccessor.cs
- Merger.cs
- Validator.cs
- EventBookmark.cs
- ISAPIApplicationHost.cs
- BaseProcessor.cs
- UnknownBitmapEncoder.cs
- SerialPinChanges.cs
- BaseValidator.cs
- WsdlExporter.cs
- DataDocumentXPathNavigator.cs
- XamlFigureLengthSerializer.cs
- ResponseBodyWriter.cs
- DbConnectionHelper.cs
- LocatorPartList.cs
- ApplicationDirectory.cs
- Root.cs
- FixedSOMTextRun.cs
- ViewManager.cs
- LinearGradientBrush.cs
- NestedContainer.cs
- Tuple.cs
- DynamicEntity.cs
- ProtocolViolationException.cs
- SecurityIdentifierElement.cs
- Privilege.cs
- ServiceObjectContainer.cs
- ProfileModule.cs
- IdentifierCollection.cs
- HwndSubclass.cs
- ImageUrlEditor.cs
- StaticTextPointer.cs
- DataMisalignedException.cs
- SkinBuilder.cs
- LocalFileSettingsProvider.cs
- CodeDOMProvider.cs
- XPathDocumentBuilder.cs
- HTMLTagNameToTypeMapper.cs
- ObjectDataSource.cs
- SetIndexBinder.cs
- HtmlHead.cs
- QuaternionKeyFrameCollection.cs
- TrackingServices.cs
- StrongBox.cs
- DataServiceQueryProvider.cs
- RuntimeUtils.cs
- ExpressionLink.cs
- DataServiceBuildProvider.cs
- DelegateHelpers.Generated.cs
- SchemaNotation.cs
- Int32Rect.cs
- SignedXmlDebugLog.cs
- DocumentAutomationPeer.cs
- Typeface.cs
- SiteOfOriginPart.cs
- ExpressionBindingCollection.cs
- GacUtil.cs
- HtmlInputCheckBox.cs
- ToolboxItemCollection.cs
- TrackingExtract.cs
- WinEventWrap.cs
- HighlightOverlayGlyph.cs
- PackWebRequest.cs
- TextEditorLists.cs
- StringToken.cs
- LinqDataSourceDisposeEventArgs.cs
- ObjectQuery.cs
- MediaScriptCommandRoutedEventArgs.cs
- HttpPostProtocolReflector.cs