Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Core / CSharp / System / Windows / ReverseInheritProperty.cs / 1 / ReverseInheritProperty.cs
using System; using System.Collections; using System.Windows.Media; using System.Windows.Input; using MS.Internal; namespace System.Windows { internal abstract class ReverseInheritProperty { internal ReverseInheritProperty( DependencyPropertyKey flagKey, CoreFlags flagCache, CoreFlags flagChanged) { FlagKey = flagKey; FlagCache = flagCache; FlagChanged = flagChanged; } internal abstract void FireNotifications(UIElement uie, ContentElement ce, UIElement3D uie3D, bool oldValue); internal void OnOriginValueChanged(DependencyObject oldOrigin, DependencyObject newOrigin, ref DeferredElementTreeState oldTreeState) { DeferredElementTreeState treeStateLocalCopy = oldTreeState; oldTreeState = null; // Step #1 // Update the cache flags for all elements in the ancestry // of the element that got turned off and record the changed nodes if (oldOrigin != null) { SetCacheFlagInAncestry(oldOrigin, false, treeStateLocalCopy); } // Step #2 // Update the cache flags for all elements in the ancestry // of the element that got turned on and record the changed nodes if (newOrigin != null) { SetCacheFlagInAncestry(newOrigin, true, null); } // Step #3 // Fire value changed on elements in the ancestry of the element that got turned off. if (oldOrigin != null) { FirePropertyChangeInAncestry(oldOrigin, true /* oldValue */, treeStateLocalCopy); } // Step #4 // Fire value changed on elements in the ancestry of the element that got turned on. if (newOrigin != null) { FirePropertyChangeInAncestry(newOrigin, false /* oldValue */, null); } if (oldTreeState == null && treeStateLocalCopy != null) { // Now that we have applied the old tree state, throw it away. treeStateLocalCopy.Clear(); oldTreeState = treeStateLocalCopy; } } void SetCacheFlagInAncestry(DependencyObject element, bool newValue, DeferredElementTreeState treeState) { // If the cache flag value is undergoing change, record it and // propagate the change to the ancestors. if ((!newValue && IsFlagSet(element, FlagCache)) || (newValue && !IsFlagSet(element, FlagCache))) { SetFlag(element, FlagCache, newValue); // NOTE: we toggle the changed flag instead of setting it so that that way common // ancestors show resultant unchanged and do not receive any change notification. SetFlag(element, FlagChanged, !IsFlagSet(element, FlagChanged)); // Check for block reverse inheritance flag, elements like popup want to set this. { UIElement uie = element as UIElement; if (uie != null) { if (uie.BlockReverseInheritance()) { return; } } ContentElement ce = element as ContentElement; if (ce != null) { if (ce.BlockReverseInheritance()) { return; } } UIElement3D ui3D = element as UIElement3D; if (ui3D != null) { if (ui3D.BlockReverseInheritance()) { return; } } } // Propagate the flag up the visual and logical trees. Note our // minimal optimization check to avoid walking both the core // and logical parents if they are the same. { DependencyObject coreParent = DeferredElementTreeState.GetInputElementParent(element, treeState); DependencyObject logicalParent = DeferredElementTreeState.GetLogicalParent(element, treeState); if (coreParent != null) { SetCacheFlagInAncestry(coreParent, newValue, treeState); } if (logicalParent != null && logicalParent != coreParent) { SetCacheFlagInAncestry(logicalParent, newValue, treeState); } } } } void FirePropertyChangeInAncestry(DependencyObject element, bool oldValue, DeferredElementTreeState treeState) { // If the cache value on the owner has been changed fire changed event if (IsFlagSet(element, FlagChanged)) { SetFlag(element, FlagChanged, false); if (oldValue) { element.ClearValue(FlagKey); } else { element.SetValue(FlagKey, true); } UIElement uie = element as UIElement; ContentElement ce = (uie != null) ? null : element as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : element as UIElement3D; FireNotifications(uie, ce, uie3D, oldValue); // Check for block reverse inheritance flag, elements like popup want to set this. if (uie != null) { if (uie.BlockReverseInheritance()) { return; } } else if (ce != null) { if (ce.BlockReverseInheritance()) { return; } } else if (uie3D != null) { if (uie3D.BlockReverseInheritance()) { return; } } // Call FirePropertyChange up the visual and logical trees. // Note our minimal optimization check to avoid walking both // the core and logical parents if they are the same. { DependencyObject coreParent = DeferredElementTreeState.GetInputElementParent(element, treeState); DependencyObject logicalParent = DeferredElementTreeState.GetLogicalParent(element, treeState); if (coreParent != null) { FirePropertyChangeInAncestry(coreParent, oldValue, treeState); } if (logicalParent != null && logicalParent != coreParent) { FirePropertyChangeInAncestry(logicalParent, oldValue, treeState); } } } } ///////////////////////////////////////////////////////////////////// void SetFlag(DependencyObject o, CoreFlags flag, bool value) { UIElement uie = o as UIElement; ContentElement ce = (uie != null) ? null : o as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : o as UIElement3D; if (uie != null) { uie.WriteFlag(flag, value); } else if (ce != null) { ce.WriteFlag(flag, value); } else if (uie3D != null) { uie3D.WriteFlag(flag, value); } } ///////////////////////////////////////////////////////////////////// bool IsFlagSet(DependencyObject o, CoreFlags flag) { UIElement uie = o as UIElement; ContentElement ce = (uie != null) ? null : o as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : o as UIElement3D; if (uie != null) { return uie.ReadFlag(flag); } else if (ce != null) { return ce.ReadFlag(flag); } else if (uie3D != null) { return uie3D.ReadFlag(flag); } return false; } ///////////////////////////////////////////////////////////////////// internal DependencyPropertyKey FlagKey; internal CoreFlags FlagCache, FlagChanged; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections; using System.Windows.Media; using System.Windows.Input; using MS.Internal; namespace System.Windows { internal abstract class ReverseInheritProperty { internal ReverseInheritProperty( DependencyPropertyKey flagKey, CoreFlags flagCache, CoreFlags flagChanged) { FlagKey = flagKey; FlagCache = flagCache; FlagChanged = flagChanged; } internal abstract void FireNotifications(UIElement uie, ContentElement ce, UIElement3D uie3D, bool oldValue); internal void OnOriginValueChanged(DependencyObject oldOrigin, DependencyObject newOrigin, ref DeferredElementTreeState oldTreeState) { DeferredElementTreeState treeStateLocalCopy = oldTreeState; oldTreeState = null; // Step #1 // Update the cache flags for all elements in the ancestry // of the element that got turned off and record the changed nodes if (oldOrigin != null) { SetCacheFlagInAncestry(oldOrigin, false, treeStateLocalCopy); } // Step #2 // Update the cache flags for all elements in the ancestry // of the element that got turned on and record the changed nodes if (newOrigin != null) { SetCacheFlagInAncestry(newOrigin, true, null); } // Step #3 // Fire value changed on elements in the ancestry of the element that got turned off. if (oldOrigin != null) { FirePropertyChangeInAncestry(oldOrigin, true /* oldValue */, treeStateLocalCopy); } // Step #4 // Fire value changed on elements in the ancestry of the element that got turned on. if (newOrigin != null) { FirePropertyChangeInAncestry(newOrigin, false /* oldValue */, null); } if (oldTreeState == null && treeStateLocalCopy != null) { // Now that we have applied the old tree state, throw it away. treeStateLocalCopy.Clear(); oldTreeState = treeStateLocalCopy; } } void SetCacheFlagInAncestry(DependencyObject element, bool newValue, DeferredElementTreeState treeState) { // If the cache flag value is undergoing change, record it and // propagate the change to the ancestors. if ((!newValue && IsFlagSet(element, FlagCache)) || (newValue && !IsFlagSet(element, FlagCache))) { SetFlag(element, FlagCache, newValue); // NOTE: we toggle the changed flag instead of setting it so that that way common // ancestors show resultant unchanged and do not receive any change notification. SetFlag(element, FlagChanged, !IsFlagSet(element, FlagChanged)); // Check for block reverse inheritance flag, elements like popup want to set this. { UIElement uie = element as UIElement; if (uie != null) { if (uie.BlockReverseInheritance()) { return; } } ContentElement ce = element as ContentElement; if (ce != null) { if (ce.BlockReverseInheritance()) { return; } } UIElement3D ui3D = element as UIElement3D; if (ui3D != null) { if (ui3D.BlockReverseInheritance()) { return; } } } // Propagate the flag up the visual and logical trees. Note our // minimal optimization check to avoid walking both the core // and logical parents if they are the same. { DependencyObject coreParent = DeferredElementTreeState.GetInputElementParent(element, treeState); DependencyObject logicalParent = DeferredElementTreeState.GetLogicalParent(element, treeState); if (coreParent != null) { SetCacheFlagInAncestry(coreParent, newValue, treeState); } if (logicalParent != null && logicalParent != coreParent) { SetCacheFlagInAncestry(logicalParent, newValue, treeState); } } } } void FirePropertyChangeInAncestry(DependencyObject element, bool oldValue, DeferredElementTreeState treeState) { // If the cache value on the owner has been changed fire changed event if (IsFlagSet(element, FlagChanged)) { SetFlag(element, FlagChanged, false); if (oldValue) { element.ClearValue(FlagKey); } else { element.SetValue(FlagKey, true); } UIElement uie = element as UIElement; ContentElement ce = (uie != null) ? null : element as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : element as UIElement3D; FireNotifications(uie, ce, uie3D, oldValue); // Check for block reverse inheritance flag, elements like popup want to set this. if (uie != null) { if (uie.BlockReverseInheritance()) { return; } } else if (ce != null) { if (ce.BlockReverseInheritance()) { return; } } else if (uie3D != null) { if (uie3D.BlockReverseInheritance()) { return; } } // Call FirePropertyChange up the visual and logical trees. // Note our minimal optimization check to avoid walking both // the core and logical parents if they are the same. { DependencyObject coreParent = DeferredElementTreeState.GetInputElementParent(element, treeState); DependencyObject logicalParent = DeferredElementTreeState.GetLogicalParent(element, treeState); if (coreParent != null) { FirePropertyChangeInAncestry(coreParent, oldValue, treeState); } if (logicalParent != null && logicalParent != coreParent) { FirePropertyChangeInAncestry(logicalParent, oldValue, treeState); } } } } ///////////////////////////////////////////////////////////////////// void SetFlag(DependencyObject o, CoreFlags flag, bool value) { UIElement uie = o as UIElement; ContentElement ce = (uie != null) ? null : o as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : o as UIElement3D; if (uie != null) { uie.WriteFlag(flag, value); } else if (ce != null) { ce.WriteFlag(flag, value); } else if (uie3D != null) { uie3D.WriteFlag(flag, value); } } ///////////////////////////////////////////////////////////////////// bool IsFlagSet(DependencyObject o, CoreFlags flag) { UIElement uie = o as UIElement; ContentElement ce = (uie != null) ? null : o as ContentElement; UIElement3D uie3D = (uie != null || ce != null) ? null : o as UIElement3D; if (uie != null) { return uie.ReadFlag(flag); } else if (ce != null) { return ce.ReadFlag(flag); } else if (uie3D != null) { return uie3D.ReadFlag(flag); } return false; } ///////////////////////////////////////////////////////////////////// internal DependencyPropertyKey FlagKey; internal CoreFlags FlagCache, FlagChanged; } } // 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
- MenuStrip.cs
- FrameworkContentElement.cs
- SoapTransportImporter.cs
- SqlCachedBuffer.cs
- CodeStatementCollection.cs
- RIPEMD160.cs
- Stroke.cs
- XmlDocumentFragment.cs
- WmlValidatorAdapter.cs
- Expressions.cs
- TrackingMemoryStream.cs
- RegistrySecurity.cs
- HorizontalAlignConverter.cs
- LogStream.cs
- DataGridColumn.cs
- XmlEntity.cs
- PositiveTimeSpanValidatorAttribute.cs
- DeploymentExceptionMapper.cs
- DefaultParameterValueAttribute.cs
- SocketPermission.cs
- SplitterCancelEvent.cs
- CookieProtection.cs
- BamlLocalizabilityResolver.cs
- RtfToXamlReader.cs
- XmlObjectSerializerWriteContextComplex.cs
- XmlToDatasetMap.cs
- ColorMap.cs
- Dispatcher.cs
- DocumentsTrace.cs
- SignedInfo.cs
- DataControlLinkButton.cs
- PriorityBindingExpression.cs
- Profiler.cs
- translator.cs
- IIS7WorkerRequest.cs
- SystemDiagnosticsSection.cs
- AnyReturnReader.cs
- TabPageDesigner.cs
- TextEvent.cs
- ProxyWebPart.cs
- XmlSchemaImporter.cs
- KeyProperty.cs
- WindowsAuthenticationModule.cs
- HostedTransportConfigurationManager.cs
- RMPublishingDialog.cs
- HttpServerVarsCollection.cs
- ContentDisposition.cs
- CharKeyFrameCollection.cs
- WebBrowserDocumentCompletedEventHandler.cs
- XPathSingletonIterator.cs
- SamlAuthenticationClaimResource.cs
- ListViewTableRow.cs
- CodeIndexerExpression.cs
- URLEditor.cs
- CharacterShapingProperties.cs
- CacheSection.cs
- CustomLineCap.cs
- DeviceFiltersSection.cs
- InvokeMemberBinder.cs
- PropertyMetadata.cs
- CalendarBlackoutDatesCollection.cs
- InfoCardSymmetricCrypto.cs
- DoWorkEventArgs.cs
- webclient.cs
- BinaryUtilClasses.cs
- DataGridViewRowCancelEventArgs.cs
- TrackingCondition.cs
- Icon.cs
- DataGridViewRowConverter.cs
- DiscreteKeyFrames.cs
- MsmqInputChannelListenerBase.cs
- DisableDpiAwarenessAttribute.cs
- TreeView.cs
- TraceLevelStore.cs
- XmlSchemaSubstitutionGroup.cs
- ConstraintManager.cs
- EditorPartChrome.cs
- ParentUndoUnit.cs
- DiscardableAttribute.cs
- BeginStoryboard.cs
- HtmlFormParameterReader.cs
- GenerateTemporaryAssemblyTask.cs
- Separator.cs
- WebResourceUtil.cs
- PointAnimation.cs
- ToolBar.cs
- ServicePointManagerElement.cs
- TraceContextRecord.cs
- ApplicationCommands.cs
- MessageSecurityOverHttpElement.cs
- ComponentResourceManager.cs
- TextEditorMouse.cs
- LayoutManager.cs
- AssemblyResourceLoader.cs
- InstanceCreationEditor.cs
- TreeView.cs
- GridViewEditEventArgs.cs
- AppDomain.cs
- HtmlGenericControl.cs
- GeometryValueSerializer.cs