Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / System / Windows / ResourcesChangeInfo.cs / 1 / ResourcesChangeInfo.cs
//----------------------------------------------------------------------------
//
// File: ResourcesChangeInfo.cs
//
// Description:
// This data-structure is used
// 1. As the data that is passed around by the DescendentsWalker
// during a resources change tree-walk.
//
// Copyright (C) by Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Windows
{
///
/// This is the data that is passed through the DescendentsWalker
/// during a resources change tree-walk.
///
internal struct ResourcesChangeInfo
{
#region Constructors
///
/// This constructor is used for notifying changes to individual
/// entries in a ResourceDictionary
///
internal ResourcesChangeInfo(object key)
{
_oldDictionaries = null;
_newDictionaries = null;
_key = key;
_container = null;
_flags = 0;
}
///
/// This constructor is used for notifying changes in Application.Resources,
/// [FE/FCE].Resources, ResourceDictionary.EndInit
///
internal ResourcesChangeInfo(ResourceDictionary oldDictionary, ResourceDictionary newDictionary)
{
_oldDictionaries = null;
if (oldDictionary != null)
{
_oldDictionaries = new List(1);
_oldDictionaries.Add(oldDictionary);
}
_newDictionaries = null;
if (newDictionary != null)
{
_newDictionaries = new List(1);
_newDictionaries.Add(newDictionary);
}
_key = null;
_container = null;
_flags = 0;
}
///
/// This constructor is used for notifying changes in Style.Resources,
/// Template.Resources, ThemeStyle.Resources
///
internal ResourcesChangeInfo(
List oldDictionaries,
List newDictionaries,
bool isStyleResourcesChange,
bool isTemplateResourcesChange,
DependencyObject container)
{
_oldDictionaries = oldDictionaries;
_newDictionaries = newDictionaries;
_key = null;
_container = container;
_flags = 0;
IsStyleResourcesChange = isStyleResourcesChange;
IsTemplateResourcesChange = isTemplateResourcesChange;
}
#endregion Constructors
#region Operations
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for theme change notifications
///
internal static ResourcesChangeInfo ThemeChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsThemeChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for tree change notifications
///
internal static ResourcesChangeInfo TreeChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsTreeChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for system colors or settings change notifications
///
internal static ResourcesChangeInfo SysColorsOrSettingsChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsSysColorsOrSettingsChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for any ResourceDictionary operations that we aren't able to provide
/// the precise 'key that changed' information
///
internal static ResourcesChangeInfo CatastrophicDictionaryChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsCatastrophicDictionaryChange = true;
return info;
}
}
// This flag is used to indicate that a theme change has occured
internal bool IsThemeChange
{
get { return ReadPrivateFlag(PrivateFlags.IsThemeChange); }
set { WritePrivateFlag(PrivateFlags.IsThemeChange, value); }
}
// This flag is used to indicate that a tree change has occured
internal bool IsTreeChange
{
get { return ReadPrivateFlag(PrivateFlags.IsTreeChange); }
set { WritePrivateFlag(PrivateFlags.IsTreeChange, value); }
}
// This flag is used to indicate that a style has changed
internal bool IsStyleResourcesChange
{
get { return ReadPrivateFlag(PrivateFlags.IsStyleResourceChange); }
set { WritePrivateFlag(PrivateFlags.IsStyleResourceChange, value); }
}
// This flag is used to indicate that this resource change was triggered from a Template change
internal bool IsTemplateResourcesChange
{
get {return ReadPrivateFlag(PrivateFlags.IsTemplateResourceChange); }
set { WritePrivateFlag(PrivateFlags.IsTemplateResourceChange, value); }
}
// This flag is used to indicate that a system color or settings change has occured
internal bool IsSysColorsOrSettingsChange
{
get {return ReadPrivateFlag(PrivateFlags.IsSysColorsOrSettingsChange); }
set { WritePrivateFlag(PrivateFlags.IsSysColorsOrSettingsChange, value); }
}
// This flag is used to indicate that a catastrophic dictionary change has occured
internal bool IsCatastrophicDictionaryChange
{
get {return ReadPrivateFlag(PrivateFlags.IsCatastrophicDictionaryChange); }
set { WritePrivateFlag(PrivateFlags.IsCatastrophicDictionaryChange, value); }
}
// This flag is used to indicate if the current operation is an effective add operation
internal bool IsResourceAddOperation
{
get { return _key != null || (_newDictionaries != null && _newDictionaries.Count > 0); }
}
// This member is used to identify the container when a style change happens
internal DependencyObject Container
{
get { return _container; }
}
// Says if either the old or the new dictionaries contain the given key
internal bool Contains(object key, bool isImplicitStyleKey)
{
if (IsTreeChange || IsCatastrophicDictionaryChange)
{
return true;
}
else if (IsThemeChange || IsSysColorsOrSettingsChange)
{
// Implicit Styles are not fetched from the Themes.
// So we do not need to respond to theme changes.
// This is a performance optimization.
return !isImplicitStyleKey;
}
Debug.Assert(_oldDictionaries != null || _newDictionaries != null || _key != null, "Must have a dictionary or a key that has changed");
if (_key != null)
{
if (Object.Equals(_key, key))
{
return true;
}
}
if (_oldDictionaries != null)
{
for (int i=0; i<_oldDictionaries.Count; i++)
{
if (_oldDictionaries[i].Contains(key))
{
return true;
}
}
}
if (_newDictionaries != null)
{
for (int i=0; i<_newDictionaries.Count; i++)
{
if (_newDictionaries[i].Contains(key))
{
return true;
}
}
}
return false;
}
#endregion Operations
#region PrivateMethods
private void WritePrivateFlag(PrivateFlags bit, bool value)
{
if (value)
{
_flags |= bit;
}
else
{
_flags &= ~bit;
}
}
private bool ReadPrivateFlag(PrivateFlags bit)
{
return (_flags & bit) != 0;
}
#endregion PrivateMethods
#region PrivateDataStructures
private enum PrivateFlags : byte
{
IsThemeChange = 0x01,
IsTreeChange = 0x02,
IsStyleResourceChange = 0x04,
IsTemplateResourceChange = 0x08,
IsSysColorsOrSettingsChange = 0x10,
IsCatastrophicDictionaryChange = 0x20,
}
#endregion PrivateDataStructures
#region Data
private List _oldDictionaries;
private List _newDictionaries;
private object _key;
private DependencyObject _container;
private PrivateFlags _flags;
#endregion Data
}
}
// 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
- WebPartChrome.cs
- DesignerDataView.cs
- StylusButtonEventArgs.cs
- Vector3DConverter.cs
- BinaryMessageEncodingBindingElement.cs
- ReliabilityContractAttribute.cs
- Brushes.cs
- SourceFilter.cs
- ISAPIApplicationHost.cs
- TreeViewAutomationPeer.cs
- OptionalColumn.cs
- LinkUtilities.cs
- Deserializer.cs
- XPathParser.cs
- WorkerRequest.cs
- Vector3D.cs
- COM2ExtendedTypeConverter.cs
- SecurityKeyType.cs
- TableCellCollection.cs
- SapiInterop.cs
- GenericRootAutomationPeer.cs
- HtmlInputHidden.cs
- KnownTypeAttribute.cs
- FileLoadException.cs
- Rotation3D.cs
- TextAdaptor.cs
- ProcessHostConfigUtils.cs
- TextLineBreak.cs
- NavigationHelper.cs
- latinshape.cs
- FrameworkElementAutomationPeer.cs
- ResourceKey.cs
- Mutex.cs
- ErrorTableItemStyle.cs
- TextServicesCompartmentEventSink.cs
- ExceptQueryOperator.cs
- XsltSettings.cs
- _AutoWebProxyScriptWrapper.cs
- ReturnValue.cs
- ApplicationInterop.cs
- FormatPage.cs
- RowUpdatingEventArgs.cs
- CompilerError.cs
- ControlBuilderAttribute.cs
- securestring.cs
- SmiTypedGetterSetter.cs
- VisualCollection.cs
- CollectionDataContract.cs
- WebPartHelpVerb.cs
- RepeaterCommandEventArgs.cs
- Accessors.cs
- Parameter.cs
- RouteCollection.cs
- Lease.cs
- TextPointerBase.cs
- RemoteCryptoSignHashRequest.cs
- ElementAction.cs
- ArgumentException.cs
- JsonGlobals.cs
- EntityCommand.cs
- ViewValidator.cs
- DictionaryItemsCollection.cs
- SmtpNtlmAuthenticationModule.cs
- CqlErrorHelper.cs
- SafeReversePInvokeHandle.cs
- ExponentialEase.cs
- ModelServiceImpl.cs
- ActivityBindForm.cs
- PresentationSource.cs
- AVElementHelper.cs
- MultipleViewPattern.cs
- CompiledXpathExpr.cs
- RayHitTestParameters.cs
- MethodBuilderInstantiation.cs
- TypeConverterBase.cs
- GPPOINT.cs
- ObjectDataSourceMethodEditor.cs
- TcpHostedTransportConfiguration.cs
- PtsCache.cs
- CellIdBoolean.cs
- WindowsListViewGroupSubsetLink.cs
- RtfFormatStack.cs
- ClientScriptManagerWrapper.cs
- TagMapInfo.cs
- AuditLogLocation.cs
- QueueProcessor.cs
- RelationshipConverter.cs
- StsCommunicationException.cs
- IgnoreFlushAndCloseStream.cs
- MarkupObject.cs
- DependencyPropertyChangedEventArgs.cs
- DetailsViewRow.cs
- webclient.cs
- WebHttpSecurityElement.cs
- _BasicClient.cs
- ButtonChrome.cs
- unsafeIndexingFilterStream.cs
- TraceHwndHost.cs
- Transactions.cs
- ColorBlend.cs