Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / ContentElement.cs / 1305600 / ContentElement.cs
using MS.Internal; using MS.Internal.KnownBoxes; using MS.Internal.PresentationCore; using MS.Utility; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Security; using System.Security.Permissions; using System.Windows.Automation; using System.Windows.Automation.Peers; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media.Animation; using System.Windows.Threading; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows { ////// ContentElement Class is a DependencyObject with IFE - input, focus, and events /// ///public partial class ContentElement : DependencyObject, IInputElement, IAnimatable { #region Construction /// /// Static Constructor for ContentElement /// ////// Critical: This hooks up a bunch of thunks which are all critical since they /// can be used to spoof input /// TreatAsSafe: Since it does not expose the thunks /// [SecurityCritical,SecurityTreatAsSafe] static ContentElement() { UIElement.RegisterEvents(typeof(ContentElement)); RegisterProperties(); UIElement.IsFocusedPropertyKey.OverrideMetadata( typeof(ContentElement), new PropertyMetadata( BooleanBoxes.FalseBox, // default value new PropertyChangedCallback(IsFocused_Changed))); } #endregion Construction #region DependencyObject #endregion ////// Helper, gives the UIParent under control of which /// the OnMeasure or OnArrange are currently called. /// This may be implemented as a tree walk up until /// LayoutElement is found. /// internal DependencyObject GetUIParent() { return GetUIParent(false); } internal DependencyObject GetUIParent(bool continuePastVisualTree) { DependencyObject e = null; // Try to find a UIElement parent in the visual ancestry. e = InputElement.GetContainingInputElement(_parent) as DependencyObject; // If there was no InputElement parent in the visual ancestry, // check along the logical branch. if(e == null && continuePastVisualTree) { DependencyObject doParent = GetUIParentCore(); e = InputElement.GetContainingInputElement(doParent) as DependencyObject; } return e; } ////// Called to get the UI parent of this element when there is /// no visual parent. /// ////// Returns a non-null value when some framework implementation /// of this method has a non-visual parent connection, /// protected virtual internal DependencyObject GetUIParentCore() { return null; } internal DependencyObject Parent { get { return _parent; } } ////// OnContentParentChanged is called when the parent of the content element is changed. /// /// Old parent or null if the content element did not have a parent before. [FriendAccessAllowed] // Built into Core, also used by Framework. internal virtual void OnContentParentChanged(DependencyObject oldParent) { SynchronizeReverseInheritPropertyFlags(oldParent, true); } #region Automation ////// Called by the Automation infrastructure when AutomationPeer /// is requested for this element. The element can return null or /// the instance of AutomationPeer-derived clas, if it supports UI Automation /// protected virtual AutomationPeer OnCreateAutomationPeer() { return null; } ////// Called by the Automation infrastructure or Control author /// to make sure the AutomationPeer is created. The element may /// create AP or return null, depending on OnCreateAutomationPeer override. /// internal AutomationPeer CreateAutomationPeer() { VerifyAccess(); //this will ensure the AP is created in the right context AutomationPeer ap = null; if (HasAutomationPeer) { ap = AutomationPeerField.GetValue(this); } else { ap = OnCreateAutomationPeer(); if (ap != null) { AutomationPeerField.SetValue(this, ap); HasAutomationPeer = true; } } return ap; } ////// Returns AutomationPeer if one exists. /// The AutomationPeer may not exist if not yet created by Automation infrastructure /// or if this element is not supposed to have one. /// internal AutomationPeer GetAutomationPeer() { VerifyAccess(); if (HasAutomationPeer) return AutomationPeerField.GetValue(this); return null; } // If this element is currently listening to synchronized input, add a pre-opportunity handler to keep track of event routed through this element. internal void AddSynchronizedInputPreOpportunityHandler(EventRoute route, RoutedEventArgs args) { if (InputManager.IsSynchronizedInput) { if (SynchronizedInputHelper.IsListening(this, args)) { RoutedEventHandler eventHandler = new RoutedEventHandler(this.SynchronizedInputPreOpportunityHandler); SynchronizedInputHelper.AddHandlerToRoute(this, route, eventHandler, false); } } } // If this element is currently listening to synchronized input, add a handler to post process the synchronized input otherwise // add a synchronized input pre-opportunity handler from parent if parent is listening. internal void AddSynchronizedInputPostOpportunityHandler(EventRoute route, RoutedEventArgs args) { if (InputManager.IsSynchronizedInput) { if (SynchronizedInputHelper.IsListening(this, args)) { RoutedEventHandler eventHandler = new RoutedEventHandler(this.SynchronizedInputPostOpportunityHandler); SynchronizedInputHelper.AddHandlerToRoute(this, route, eventHandler, true); } else { // Add a preview handler from the parent. SynchronizedInputHelper.AddParentPreOpportunityHandler(this, route, args); } } } // This event handler to be called before all the class & instance handlers for this element. internal void SynchronizedInputPreOpportunityHandler(object sender, RoutedEventArgs args) { if (!args.Handled) { SynchronizedInputHelper.PreOpportunityHandler(sender, args); } } // This event handler to be called after class & instance handlers for this element. internal void SynchronizedInputPostOpportunityHandler(object sender, RoutedEventArgs args) { if (args.Handled && (InputManager.SynchronizedInputState == SynchronizedInputStates.HadOpportunity)) { SynchronizedInputHelper.PostOpportunityHandler(sender, args); } } // Called by automation peer, when called this element will be the listening element for synchronized input. internal bool StartListeningSynchronizedInput(SynchronizedInputType inputType) { if (InputManager.IsSynchronizedInput) { return false; } else { InputManager.StartListeningSynchronizedInput(this, inputType); return true; } } // When called, input processing will return to normal mode. internal void CancelSynchronizedInput() { InputManager.CancelSynchronizedInput(); } #endregion Automation #region Input ////// A property indicating if the mouse is over this element or not. /// public bool IsMouseDirectlyOver { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsMouseDirectlyOver_ComputeValue(); } } private bool IsMouseDirectlyOver_ComputeValue() { return (Mouse.DirectlyOver == this); } ////// Asynchronously re-evaluate the reverse-inherited properties. /// [FriendAccessAllowed] internal void SynchronizeReverseInheritPropertyFlags(DependencyObject oldParent, bool isCoreParent) { if(IsKeyboardFocusWithin) { Keyboard.PrimaryDevice.ReevaluateFocusAsync(this, oldParent, isCoreParent); } // Reevelauate the stylus properties first to guarentee that our property change // notifications fire before mouse properties. if(IsStylusOver) { StylusLogic.CurrentStylusLogicReevaluateStylusOver(this, oldParent, isCoreParent); } if(IsStylusCaptureWithin) { StylusLogic.CurrentStylusLogicReevaluateCapture(this, oldParent, isCoreParent); } if(IsMouseOver) { Mouse.PrimaryDevice.ReevaluateMouseOver(this, oldParent, isCoreParent); } if(IsMouseCaptureWithin) { Mouse.PrimaryDevice.ReevaluateCapture(this, oldParent, isCoreParent); } if (AreAnyTouchesOver) { TouchDevice.ReevaluateDirectlyOver(this, oldParent, isCoreParent); } if (AreAnyTouchesCapturedWithin) { TouchDevice.ReevaluateCapturedWithin(this, oldParent, isCoreParent); } } ////// BlockReverseInheritance method when overriden stops reverseInheritProperties from updating their parent level properties. /// internal virtual bool BlockReverseInheritance() { return false; } ////// A property indicating if the mouse is over this element or not. /// public bool IsMouseOver { get { return ReadFlag(CoreFlags.IsMouseOverCache); } } ////// A property indicating if the stylus is over this element or not. /// public bool IsStylusOver { get { return ReadFlag(CoreFlags.IsStylusOverCache); } } ////// Indicates if Keyboard Focus is anywhere /// within in the subtree starting at the /// current instance /// public bool IsKeyboardFocusWithin { get { return ReadFlag(CoreFlags.IsKeyboardFocusWithinCache); } } ////// A property indicating if the mouse is captured to this element or not. /// public bool IsMouseCaptured { get { return (bool) GetValue(IsMouseCapturedProperty); } } ////// Captures the mouse to this element. /// public bool CaptureMouse() { return Mouse.Capture(this); } ////// Releases the mouse capture. /// public void ReleaseMouseCapture() { Mouse.Capture(null); } ////// Indicates if mouse capture is anywhere within in the subtree /// starting at the current instance /// public bool IsMouseCaptureWithin { get { return ReadFlag(CoreFlags.IsMouseCaptureWithinCache); } } ////// A property indicating if the stylus is over this element or not. /// public bool IsStylusDirectlyOver { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsStylusDirectlyOver_ComputeValue(); } } private bool IsStylusDirectlyOver_ComputeValue() { return (Stylus.DirectlyOver == this); } ////// A property indicating if the stylus is captured to this element or not. /// public bool IsStylusCaptured { get { return (bool) GetValue(IsStylusCapturedProperty); } } ////// Captures the stylus to this element. /// public bool CaptureStylus() { return Stylus.Capture(this); } ////// Releases the stylus capture. /// public void ReleaseStylusCapture() { Stylus.Capture(null); } ////// Indicates if stylus capture is anywhere within in the subtree /// starting at the current instance /// public bool IsStylusCaptureWithin { get { return ReadFlag(CoreFlags.IsStylusCaptureWithinCache); } } ////// A property indicating if the keyboard is focused on this /// element or not. /// public bool IsKeyboardFocused { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsKeyboardFocused_ComputeValue(); } } private bool IsKeyboardFocused_ComputeValue() { return (Keyboard.FocusedElement == this); } ////// Focuses the keyboard on this element. /// public bool Focus() { return Keyboard.Focus(this) == this; } ////// Request to move the focus from this element to another element /// /// Determine how to move the focus ///Returns true if focus is moved successfully. Returns false if there is no next element public virtual bool MoveFocus(TraversalRequest request) { return false; } ////// Request to predict the element that should receive focus relative to this element for a /// given direction, without actually moving focus to it. /// /// The direction for which focus should be predicted ////// Returns the next element that focus should move to for a given FocusNavigationDirection. /// Returns null if focus cannot be moved relative to this element. /// public virtual DependencyObject PredictFocus(FocusNavigationDirection direction) { return null; } ////// GotFocus event /// public static readonly RoutedEvent GotFocusEvent = FocusManager.GotFocusEvent.AddOwner(typeof(ContentElement)); ////// An event announcing that IsFocused changed to true. /// public event RoutedEventHandler GotFocus { add { AddHandler(GotFocusEvent, value); } remove { RemoveHandler(GotFocusEvent, value); } } ////// LostFocus event /// public static readonly RoutedEvent LostFocusEvent = FocusManager.LostFocusEvent.AddOwner(typeof(ContentElement)); ////// An event announcing that IsFocused changed to false. /// public event RoutedEventHandler LostFocus { add { AddHandler(LostFocusEvent, value); } remove { RemoveHandler(LostFocusEvent, value); } } ////// The DependencyProperty for IsFocused. /// Flags: None /// Read-Only: true /// public static readonly DependencyProperty IsFocusedProperty = UIElement.IsFocusedProperty.AddOwner( typeof(ContentElement)); private static void IsFocused_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = ((ContentElement) d); if ((bool) e.NewValue) { ce.OnGotFocus(new RoutedEventArgs(GotFocusEvent, ce)); } else { ce.OnLostFocus(new RoutedEventArgs(LostFocusEvent, ce)); } } ////// This method is invoked when the IsFocused property changes to true /// /// RoutedEventArgs protected virtual void OnGotFocus(RoutedEventArgs e) { RaiseEvent(e); } ////// This method is invoked when the IsFocused property changes to false /// /// RoutedEventArgs protected virtual void OnLostFocus(RoutedEventArgs e) { RaiseEvent(e); } ////// Gettor for IsFocused Property /// public bool IsFocused { get { return (bool) GetValue(IsFocusedProperty); } } ////// The DependencyProperty for the IsEnabled property. /// public static readonly DependencyProperty IsEnabledProperty = UIElement.IsEnabledProperty.AddOwner( typeof(ContentElement), new UIPropertyMetadata( BooleanBoxes.TrueBox, // default value new PropertyChangedCallback(OnIsEnabledChanged), new CoerceValueCallback(CoerceIsEnabled))); ////// A property indicating if this element is enabled or not. /// public bool IsEnabled { get { return (bool) GetValue(IsEnabledProperty); } set { SetValue(IsEnabledProperty, BooleanBoxes.Box(value)); } } ////// IsEnabledChanged event /// public event DependencyPropertyChangedEventHandler IsEnabledChanged { add { EventHandlersStoreAdd(UIElement.IsEnabledChangedKey, value); } remove { EventHandlersStoreRemove(UIElement.IsEnabledChangedKey, value); } } ////// Fetches the value that IsEnabled should be coerced to. /// ////// This method is virtual is so that controls derived from UIElement /// can combine additional requirements into the coersion logic. /// /// It is important for anyone overriding this property to also /// call CoerceValue when any of their dependencies change. /// protected virtual bool IsEnabledCore { get { // As of 1/25/2006, the following controls override this method: // Hyperlink.IsEnabledCore: CanExecute return true; } } private static object CoerceIsEnabled(DependencyObject d, object value) { ContentElement ce = (ContentElement) d; // We must be false if our parent is false, but we can be // either true or false if our parent is true. // // Another way of saying this is that we can only be true // if our parent is true, but we can always be false. if((bool) value) { // Use the "logical" parent. This is different that UIElement, which // uses the visual parent. But the "content parent" is not a complete // tree description (for instance, we don't track "content children"), // so the best we can do is use the logical tree for ContentElements. // // Note: we assume the "logical" parent of a ContentElement is either // a UIElement or ContentElement. We explicitly assume that there // is never a raw Visual as the parent. DependencyObject parent = ce.GetUIParentCore(); if(parent == null || (bool)parent.GetValue(IsEnabledProperty)) { return BooleanBoxes.Box(ce.IsEnabledCore); } else { return BooleanBoxes.FalseBox; } } else { return BooleanBoxes.FalseBox; } } private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = (ContentElement)d; // Raise the public changed event. ce.RaiseDependencyPropertyChanged(UIElement.IsEnabledChangedKey, e); // Invalidate the children so that they will inherit the new value. ce.InvalidateForceInheritPropertyOnChildren(e.Property); // The input manager needs to re-hittest because something changed // that is involved in the hit-testing we do, so a different result // could be returned. InputManager.SafeCurrentNotifyHitTestInvalidated(); } //********************************************************************** #region Focusable Property //********************************************************************* ////// The DependencyProperty for the Focusable property. /// [CommonDependencyProperty] public static readonly DependencyProperty FocusableProperty = UIElement.FocusableProperty.AddOwner( typeof(ContentElement), new UIPropertyMetadata( BooleanBoxes.FalseBox, // default value new PropertyChangedCallback(OnFocusableChanged))); ////// Gettor and Settor for Focusable Property /// public bool Focusable { get { return (bool) GetValue(FocusableProperty); } set { SetValue(FocusableProperty, BooleanBoxes.Box(value)); } } ////// FocusableChanged event /// public event DependencyPropertyChangedEventHandler FocusableChanged { add {EventHandlersStoreAdd(UIElement.FocusableChangedKey, value);} remove {EventHandlersStoreRemove(UIElement.FocusableChangedKey, value);} } private static void OnFocusableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = (ContentElement) d; // Raise the public changed event. ce.RaiseDependencyPropertyChanged(UIElement.FocusableChangedKey, e); } //********************************************************************* #endregion Focusable Property //********************************************************************* ////// A property indicating if the inptu method is enabled. /// public bool IsInputMethodEnabled { get { return (bool) GetValue(InputMethod.IsInputMethodEnabledProperty); } } #endregion Input #region Operations private void RaiseMouseButtonEvent(EventPrivateKey key, MouseButtonEventArgs e) { EventHandlersStore store = EventHandlersStore; if (store != null) { Delegate handler = store.Get(key); if (handler != null) { ((MouseButtonEventHandler)handler)(this, e); } } } // Helper method to retrieve and fire Clr Event handlers for DependencyPropertyChanged event private void RaiseDependencyPropertyChanged(EventPrivateKey key, DependencyPropertyChangedEventArgs args) { EventHandlersStore store = EventHandlersStore; if (store != null) { Delegate handler = store.Get(key); if (handler != null) { ((DependencyPropertyChangedEventHandler)handler)(this, args); } } } #endregion Operations #region AllowDrop ////// The DependencyProperty for the AllowDrop property. /// public static readonly DependencyProperty AllowDropProperty = UIElement.AllowDropProperty.AddOwner( typeof(ContentElement), new PropertyMetadata(BooleanBoxes.FalseBox)); ////// A dependency property that allows the drop object as DragDrop target. /// public bool AllowDrop { get { return (bool) GetValue(AllowDropProperty); } set { SetValue(AllowDropProperty, BooleanBoxes.Box(value)); } } #endregion AllowDrop #region ForceInherit property support // This has to be virtual, since there is no concept of "core" content children, // so we have no choice by to rely on FrameworkContentElement to use logical // children instead. internal virtual void InvalidateForceInheritPropertyOnChildren(DependencyProperty property) { } #endregion #region Touch ////// A property indicating if any touch devices are over this element or not. /// public bool AreAnyTouchesOver { get { return ReadFlag(CoreFlags.TouchesOverCache); } } ////// A property indicating if any touch devices are directly over this element or not. /// public bool AreAnyTouchesDirectlyOver { get { return (bool)GetValue(AreAnyTouchesDirectlyOverProperty); } } ////// A property indicating if any touch devices are captured to elements in this subtree. /// public bool AreAnyTouchesCapturedWithin { get { return ReadFlag(CoreFlags.TouchesCapturedWithinCache); } } ////// A property indicating if any touch devices are captured to this element. /// public bool AreAnyTouchesCaptured { get { return (bool)GetValue(AreAnyTouchesCapturedProperty); } } ////// Captures the specified device to this element. /// /// The touch device to capture. ///True if capture was taken. public bool CaptureTouch(TouchDevice touchDevice) { if (touchDevice == null) { throw new ArgumentNullException("touchDevice"); } return touchDevice.Capture(this); } ////// Releases capture from the specified touch device. /// /// The device that is captured to this element. ///true if capture was released, false otherwise. public bool ReleaseTouchCapture(TouchDevice touchDevice) { if (touchDevice == null) { throw new ArgumentNullException("touchDevice"); } if (touchDevice.Captured == this) { touchDevice.Capture(null); return true; } else { return false; } } ////// Releases capture on any touch devices captured to this element. /// public void ReleaseAllTouchCaptures() { TouchDevice.ReleaseAllCaptures(this); } ////// The touch devices captured to this element. /// public IEnumerableTouchesCaptured { get { return TouchDevice.GetCapturedTouches(this, /* includeWithin = */ false); } } /// /// The touch devices captured to this element and any elements in the subtree. /// public IEnumerableTouchesCapturedWithin { get { return TouchDevice.GetCapturedTouches(this, /* includeWithin = */ true); } } /// /// The touch devices which are over this element and any elements in the subtree. /// This is particularly relevant to elements which dont take capture (like Label). /// public IEnumerableTouchesOver { get { return TouchDevice.GetTouchesOver(this, /* includeWithin = */ true); } } /// /// The touch devices which are directly over this element. /// This is particularly relevant to elements which dont take capture (like Label). /// public IEnumerableTouchesDirectlyOver { get { return TouchDevice.GetTouchesOver(this, /* includeWithin = */ false); } } #endregion internal bool HasAutomationPeer { get { return ReadFlag(CoreFlags.HasAutomationPeer); } set { WriteFlag(CoreFlags.HasAutomationPeer, value); } } #region Data internal DependencyObject _parent; ///// ATTACHED STORAGE ///// internal static readonly UncommonField EventHandlersStoreField = UIElement.EventHandlersStoreField; internal static readonly UncommonField InputBindingCollectionField = UIElement.InputBindingCollectionField; internal static readonly UncommonField CommandBindingCollectionField = UIElement.CommandBindingCollectionField; private static readonly UncommonField AutomationPeerField = new UncommonField (); // Caches the ContentElement's DependencyObjectType private static DependencyObjectType ContentElementType = DependencyObjectType.FromSystemTypeInternal(typeof(ContentElement)); #endregion Data } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using MS.Internal; using MS.Internal.KnownBoxes; using MS.Internal.PresentationCore; using MS.Utility; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Security; using System.Security.Permissions; using System.Windows.Automation; using System.Windows.Automation.Peers; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media.Animation; using System.Windows.Threading; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows { /// /// ContentElement Class is a DependencyObject with IFE - input, focus, and events /// ///public partial class ContentElement : DependencyObject, IInputElement, IAnimatable { #region Construction /// /// Static Constructor for ContentElement /// ////// Critical: This hooks up a bunch of thunks which are all critical since they /// can be used to spoof input /// TreatAsSafe: Since it does not expose the thunks /// [SecurityCritical,SecurityTreatAsSafe] static ContentElement() { UIElement.RegisterEvents(typeof(ContentElement)); RegisterProperties(); UIElement.IsFocusedPropertyKey.OverrideMetadata( typeof(ContentElement), new PropertyMetadata( BooleanBoxes.FalseBox, // default value new PropertyChangedCallback(IsFocused_Changed))); } #endregion Construction #region DependencyObject #endregion ////// Helper, gives the UIParent under control of which /// the OnMeasure or OnArrange are currently called. /// This may be implemented as a tree walk up until /// LayoutElement is found. /// internal DependencyObject GetUIParent() { return GetUIParent(false); } internal DependencyObject GetUIParent(bool continuePastVisualTree) { DependencyObject e = null; // Try to find a UIElement parent in the visual ancestry. e = InputElement.GetContainingInputElement(_parent) as DependencyObject; // If there was no InputElement parent in the visual ancestry, // check along the logical branch. if(e == null && continuePastVisualTree) { DependencyObject doParent = GetUIParentCore(); e = InputElement.GetContainingInputElement(doParent) as DependencyObject; } return e; } ////// Called to get the UI parent of this element when there is /// no visual parent. /// ////// Returns a non-null value when some framework implementation /// of this method has a non-visual parent connection, /// protected virtual internal DependencyObject GetUIParentCore() { return null; } internal DependencyObject Parent { get { return _parent; } } ////// OnContentParentChanged is called when the parent of the content element is changed. /// /// Old parent or null if the content element did not have a parent before. [FriendAccessAllowed] // Built into Core, also used by Framework. internal virtual void OnContentParentChanged(DependencyObject oldParent) { SynchronizeReverseInheritPropertyFlags(oldParent, true); } #region Automation ////// Called by the Automation infrastructure when AutomationPeer /// is requested for this element. The element can return null or /// the instance of AutomationPeer-derived clas, if it supports UI Automation /// protected virtual AutomationPeer OnCreateAutomationPeer() { return null; } ////// Called by the Automation infrastructure or Control author /// to make sure the AutomationPeer is created. The element may /// create AP or return null, depending on OnCreateAutomationPeer override. /// internal AutomationPeer CreateAutomationPeer() { VerifyAccess(); //this will ensure the AP is created in the right context AutomationPeer ap = null; if (HasAutomationPeer) { ap = AutomationPeerField.GetValue(this); } else { ap = OnCreateAutomationPeer(); if (ap != null) { AutomationPeerField.SetValue(this, ap); HasAutomationPeer = true; } } return ap; } ////// Returns AutomationPeer if one exists. /// The AutomationPeer may not exist if not yet created by Automation infrastructure /// or if this element is not supposed to have one. /// internal AutomationPeer GetAutomationPeer() { VerifyAccess(); if (HasAutomationPeer) return AutomationPeerField.GetValue(this); return null; } // If this element is currently listening to synchronized input, add a pre-opportunity handler to keep track of event routed through this element. internal void AddSynchronizedInputPreOpportunityHandler(EventRoute route, RoutedEventArgs args) { if (InputManager.IsSynchronizedInput) { if (SynchronizedInputHelper.IsListening(this, args)) { RoutedEventHandler eventHandler = new RoutedEventHandler(this.SynchronizedInputPreOpportunityHandler); SynchronizedInputHelper.AddHandlerToRoute(this, route, eventHandler, false); } } } // If this element is currently listening to synchronized input, add a handler to post process the synchronized input otherwise // add a synchronized input pre-opportunity handler from parent if parent is listening. internal void AddSynchronizedInputPostOpportunityHandler(EventRoute route, RoutedEventArgs args) { if (InputManager.IsSynchronizedInput) { if (SynchronizedInputHelper.IsListening(this, args)) { RoutedEventHandler eventHandler = new RoutedEventHandler(this.SynchronizedInputPostOpportunityHandler); SynchronizedInputHelper.AddHandlerToRoute(this, route, eventHandler, true); } else { // Add a preview handler from the parent. SynchronizedInputHelper.AddParentPreOpportunityHandler(this, route, args); } } } // This event handler to be called before all the class & instance handlers for this element. internal void SynchronizedInputPreOpportunityHandler(object sender, RoutedEventArgs args) { if (!args.Handled) { SynchronizedInputHelper.PreOpportunityHandler(sender, args); } } // This event handler to be called after class & instance handlers for this element. internal void SynchronizedInputPostOpportunityHandler(object sender, RoutedEventArgs args) { if (args.Handled && (InputManager.SynchronizedInputState == SynchronizedInputStates.HadOpportunity)) { SynchronizedInputHelper.PostOpportunityHandler(sender, args); } } // Called by automation peer, when called this element will be the listening element for synchronized input. internal bool StartListeningSynchronizedInput(SynchronizedInputType inputType) { if (InputManager.IsSynchronizedInput) { return false; } else { InputManager.StartListeningSynchronizedInput(this, inputType); return true; } } // When called, input processing will return to normal mode. internal void CancelSynchronizedInput() { InputManager.CancelSynchronizedInput(); } #endregion Automation #region Input ////// A property indicating if the mouse is over this element or not. /// public bool IsMouseDirectlyOver { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsMouseDirectlyOver_ComputeValue(); } } private bool IsMouseDirectlyOver_ComputeValue() { return (Mouse.DirectlyOver == this); } ////// Asynchronously re-evaluate the reverse-inherited properties. /// [FriendAccessAllowed] internal void SynchronizeReverseInheritPropertyFlags(DependencyObject oldParent, bool isCoreParent) { if(IsKeyboardFocusWithin) { Keyboard.PrimaryDevice.ReevaluateFocusAsync(this, oldParent, isCoreParent); } // Reevelauate the stylus properties first to guarentee that our property change // notifications fire before mouse properties. if(IsStylusOver) { StylusLogic.CurrentStylusLogicReevaluateStylusOver(this, oldParent, isCoreParent); } if(IsStylusCaptureWithin) { StylusLogic.CurrentStylusLogicReevaluateCapture(this, oldParent, isCoreParent); } if(IsMouseOver) { Mouse.PrimaryDevice.ReevaluateMouseOver(this, oldParent, isCoreParent); } if(IsMouseCaptureWithin) { Mouse.PrimaryDevice.ReevaluateCapture(this, oldParent, isCoreParent); } if (AreAnyTouchesOver) { TouchDevice.ReevaluateDirectlyOver(this, oldParent, isCoreParent); } if (AreAnyTouchesCapturedWithin) { TouchDevice.ReevaluateCapturedWithin(this, oldParent, isCoreParent); } } ////// BlockReverseInheritance method when overriden stops reverseInheritProperties from updating their parent level properties. /// internal virtual bool BlockReverseInheritance() { return false; } ////// A property indicating if the mouse is over this element or not. /// public bool IsMouseOver { get { return ReadFlag(CoreFlags.IsMouseOverCache); } } ////// A property indicating if the stylus is over this element or not. /// public bool IsStylusOver { get { return ReadFlag(CoreFlags.IsStylusOverCache); } } ////// Indicates if Keyboard Focus is anywhere /// within in the subtree starting at the /// current instance /// public bool IsKeyboardFocusWithin { get { return ReadFlag(CoreFlags.IsKeyboardFocusWithinCache); } } ////// A property indicating if the mouse is captured to this element or not. /// public bool IsMouseCaptured { get { return (bool) GetValue(IsMouseCapturedProperty); } } ////// Captures the mouse to this element. /// public bool CaptureMouse() { return Mouse.Capture(this); } ////// Releases the mouse capture. /// public void ReleaseMouseCapture() { Mouse.Capture(null); } ////// Indicates if mouse capture is anywhere within in the subtree /// starting at the current instance /// public bool IsMouseCaptureWithin { get { return ReadFlag(CoreFlags.IsMouseCaptureWithinCache); } } ////// A property indicating if the stylus is over this element or not. /// public bool IsStylusDirectlyOver { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsStylusDirectlyOver_ComputeValue(); } } private bool IsStylusDirectlyOver_ComputeValue() { return (Stylus.DirectlyOver == this); } ////// A property indicating if the stylus is captured to this element or not. /// public bool IsStylusCaptured { get { return (bool) GetValue(IsStylusCapturedProperty); } } ////// Captures the stylus to this element. /// public bool CaptureStylus() { return Stylus.Capture(this); } ////// Releases the stylus capture. /// public void ReleaseStylusCapture() { Stylus.Capture(null); } ////// Indicates if stylus capture is anywhere within in the subtree /// starting at the current instance /// public bool IsStylusCaptureWithin { get { return ReadFlag(CoreFlags.IsStylusCaptureWithinCache); } } ////// A property indicating if the keyboard is focused on this /// element or not. /// public bool IsKeyboardFocused { get { // We do not return the cached value of reverse-inherited seed properties. // // The cached value is only used internally to detect a "change". // // More Info: // The act of invalidating the seed property of a reverse-inherited property // on the first side of the path causes the invalidation of the // reverse-inherited properties on both sides. The input system has not yet // invalidated the seed property on the second side, so its cached value can // be incorrect. // return IsKeyboardFocused_ComputeValue(); } } private bool IsKeyboardFocused_ComputeValue() { return (Keyboard.FocusedElement == this); } ////// Focuses the keyboard on this element. /// public bool Focus() { return Keyboard.Focus(this) == this; } ////// Request to move the focus from this element to another element /// /// Determine how to move the focus ///Returns true if focus is moved successfully. Returns false if there is no next element public virtual bool MoveFocus(TraversalRequest request) { return false; } ////// Request to predict the element that should receive focus relative to this element for a /// given direction, without actually moving focus to it. /// /// The direction for which focus should be predicted ////// Returns the next element that focus should move to for a given FocusNavigationDirection. /// Returns null if focus cannot be moved relative to this element. /// public virtual DependencyObject PredictFocus(FocusNavigationDirection direction) { return null; } ////// GotFocus event /// public static readonly RoutedEvent GotFocusEvent = FocusManager.GotFocusEvent.AddOwner(typeof(ContentElement)); ////// An event announcing that IsFocused changed to true. /// public event RoutedEventHandler GotFocus { add { AddHandler(GotFocusEvent, value); } remove { RemoveHandler(GotFocusEvent, value); } } ////// LostFocus event /// public static readonly RoutedEvent LostFocusEvent = FocusManager.LostFocusEvent.AddOwner(typeof(ContentElement)); ////// An event announcing that IsFocused changed to false. /// public event RoutedEventHandler LostFocus { add { AddHandler(LostFocusEvent, value); } remove { RemoveHandler(LostFocusEvent, value); } } ////// The DependencyProperty for IsFocused. /// Flags: None /// Read-Only: true /// public static readonly DependencyProperty IsFocusedProperty = UIElement.IsFocusedProperty.AddOwner( typeof(ContentElement)); private static void IsFocused_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = ((ContentElement) d); if ((bool) e.NewValue) { ce.OnGotFocus(new RoutedEventArgs(GotFocusEvent, ce)); } else { ce.OnLostFocus(new RoutedEventArgs(LostFocusEvent, ce)); } } ////// This method is invoked when the IsFocused property changes to true /// /// RoutedEventArgs protected virtual void OnGotFocus(RoutedEventArgs e) { RaiseEvent(e); } ////// This method is invoked when the IsFocused property changes to false /// /// RoutedEventArgs protected virtual void OnLostFocus(RoutedEventArgs e) { RaiseEvent(e); } ////// Gettor for IsFocused Property /// public bool IsFocused { get { return (bool) GetValue(IsFocusedProperty); } } ////// The DependencyProperty for the IsEnabled property. /// public static readonly DependencyProperty IsEnabledProperty = UIElement.IsEnabledProperty.AddOwner( typeof(ContentElement), new UIPropertyMetadata( BooleanBoxes.TrueBox, // default value new PropertyChangedCallback(OnIsEnabledChanged), new CoerceValueCallback(CoerceIsEnabled))); ////// A property indicating if this element is enabled or not. /// public bool IsEnabled { get { return (bool) GetValue(IsEnabledProperty); } set { SetValue(IsEnabledProperty, BooleanBoxes.Box(value)); } } ////// IsEnabledChanged event /// public event DependencyPropertyChangedEventHandler IsEnabledChanged { add { EventHandlersStoreAdd(UIElement.IsEnabledChangedKey, value); } remove { EventHandlersStoreRemove(UIElement.IsEnabledChangedKey, value); } } ////// Fetches the value that IsEnabled should be coerced to. /// ////// This method is virtual is so that controls derived from UIElement /// can combine additional requirements into the coersion logic. /// /// It is important for anyone overriding this property to also /// call CoerceValue when any of their dependencies change. /// protected virtual bool IsEnabledCore { get { // As of 1/25/2006, the following controls override this method: // Hyperlink.IsEnabledCore: CanExecute return true; } } private static object CoerceIsEnabled(DependencyObject d, object value) { ContentElement ce = (ContentElement) d; // We must be false if our parent is false, but we can be // either true or false if our parent is true. // // Another way of saying this is that we can only be true // if our parent is true, but we can always be false. if((bool) value) { // Use the "logical" parent. This is different that UIElement, which // uses the visual parent. But the "content parent" is not a complete // tree description (for instance, we don't track "content children"), // so the best we can do is use the logical tree for ContentElements. // // Note: we assume the "logical" parent of a ContentElement is either // a UIElement or ContentElement. We explicitly assume that there // is never a raw Visual as the parent. DependencyObject parent = ce.GetUIParentCore(); if(parent == null || (bool)parent.GetValue(IsEnabledProperty)) { return BooleanBoxes.Box(ce.IsEnabledCore); } else { return BooleanBoxes.FalseBox; } } else { return BooleanBoxes.FalseBox; } } private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = (ContentElement)d; // Raise the public changed event. ce.RaiseDependencyPropertyChanged(UIElement.IsEnabledChangedKey, e); // Invalidate the children so that they will inherit the new value. ce.InvalidateForceInheritPropertyOnChildren(e.Property); // The input manager needs to re-hittest because something changed // that is involved in the hit-testing we do, so a different result // could be returned. InputManager.SafeCurrentNotifyHitTestInvalidated(); } //********************************************************************** #region Focusable Property //********************************************************************* ////// The DependencyProperty for the Focusable property. /// [CommonDependencyProperty] public static readonly DependencyProperty FocusableProperty = UIElement.FocusableProperty.AddOwner( typeof(ContentElement), new UIPropertyMetadata( BooleanBoxes.FalseBox, // default value new PropertyChangedCallback(OnFocusableChanged))); ////// Gettor and Settor for Focusable Property /// public bool Focusable { get { return (bool) GetValue(FocusableProperty); } set { SetValue(FocusableProperty, BooleanBoxes.Box(value)); } } ////// FocusableChanged event /// public event DependencyPropertyChangedEventHandler FocusableChanged { add {EventHandlersStoreAdd(UIElement.FocusableChangedKey, value);} remove {EventHandlersStoreRemove(UIElement.FocusableChangedKey, value);} } private static void OnFocusableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContentElement ce = (ContentElement) d; // Raise the public changed event. ce.RaiseDependencyPropertyChanged(UIElement.FocusableChangedKey, e); } //********************************************************************* #endregion Focusable Property //********************************************************************* ////// A property indicating if the inptu method is enabled. /// public bool IsInputMethodEnabled { get { return (bool) GetValue(InputMethod.IsInputMethodEnabledProperty); } } #endregion Input #region Operations private void RaiseMouseButtonEvent(EventPrivateKey key, MouseButtonEventArgs e) { EventHandlersStore store = EventHandlersStore; if (store != null) { Delegate handler = store.Get(key); if (handler != null) { ((MouseButtonEventHandler)handler)(this, e); } } } // Helper method to retrieve and fire Clr Event handlers for DependencyPropertyChanged event private void RaiseDependencyPropertyChanged(EventPrivateKey key, DependencyPropertyChangedEventArgs args) { EventHandlersStore store = EventHandlersStore; if (store != null) { Delegate handler = store.Get(key); if (handler != null) { ((DependencyPropertyChangedEventHandler)handler)(this, args); } } } #endregion Operations #region AllowDrop ////// The DependencyProperty for the AllowDrop property. /// public static readonly DependencyProperty AllowDropProperty = UIElement.AllowDropProperty.AddOwner( typeof(ContentElement), new PropertyMetadata(BooleanBoxes.FalseBox)); ////// A dependency property that allows the drop object as DragDrop target. /// public bool AllowDrop { get { return (bool) GetValue(AllowDropProperty); } set { SetValue(AllowDropProperty, BooleanBoxes.Box(value)); } } #endregion AllowDrop #region ForceInherit property support // This has to be virtual, since there is no concept of "core" content children, // so we have no choice by to rely on FrameworkContentElement to use logical // children instead. internal virtual void InvalidateForceInheritPropertyOnChildren(DependencyProperty property) { } #endregion #region Touch ////// A property indicating if any touch devices are over this element or not. /// public bool AreAnyTouchesOver { get { return ReadFlag(CoreFlags.TouchesOverCache); } } ////// A property indicating if any touch devices are directly over this element or not. /// public bool AreAnyTouchesDirectlyOver { get { return (bool)GetValue(AreAnyTouchesDirectlyOverProperty); } } ////// A property indicating if any touch devices are captured to elements in this subtree. /// public bool AreAnyTouchesCapturedWithin { get { return ReadFlag(CoreFlags.TouchesCapturedWithinCache); } } ////// A property indicating if any touch devices are captured to this element. /// public bool AreAnyTouchesCaptured { get { return (bool)GetValue(AreAnyTouchesCapturedProperty); } } ////// Captures the specified device to this element. /// /// The touch device to capture. ///True if capture was taken. public bool CaptureTouch(TouchDevice touchDevice) { if (touchDevice == null) { throw new ArgumentNullException("touchDevice"); } return touchDevice.Capture(this); } ////// Releases capture from the specified touch device. /// /// The device that is captured to this element. ///true if capture was released, false otherwise. public bool ReleaseTouchCapture(TouchDevice touchDevice) { if (touchDevice == null) { throw new ArgumentNullException("touchDevice"); } if (touchDevice.Captured == this) { touchDevice.Capture(null); return true; } else { return false; } } ////// Releases capture on any touch devices captured to this element. /// public void ReleaseAllTouchCaptures() { TouchDevice.ReleaseAllCaptures(this); } ////// The touch devices captured to this element. /// public IEnumerableTouchesCaptured { get { return TouchDevice.GetCapturedTouches(this, /* includeWithin = */ false); } } /// /// The touch devices captured to this element and any elements in the subtree. /// public IEnumerableTouchesCapturedWithin { get { return TouchDevice.GetCapturedTouches(this, /* includeWithin = */ true); } } /// /// The touch devices which are over this element and any elements in the subtree. /// This is particularly relevant to elements which dont take capture (like Label). /// public IEnumerableTouchesOver { get { return TouchDevice.GetTouchesOver(this, /* includeWithin = */ true); } } /// /// The touch devices which are directly over this element. /// This is particularly relevant to elements which dont take capture (like Label). /// public IEnumerableTouchesDirectlyOver { get { return TouchDevice.GetTouchesOver(this, /* includeWithin = */ false); } } #endregion internal bool HasAutomationPeer { get { return ReadFlag(CoreFlags.HasAutomationPeer); } set { WriteFlag(CoreFlags.HasAutomationPeer, value); } } #region Data internal DependencyObject _parent; ///// ATTACHED STORAGE ///// internal static readonly UncommonField EventHandlersStoreField = UIElement.EventHandlersStoreField; internal static readonly UncommonField InputBindingCollectionField = UIElement.InputBindingCollectionField; internal static readonly UncommonField CommandBindingCollectionField = UIElement.CommandBindingCollectionField; private static readonly UncommonField AutomationPeerField = new UncommonField (); // Caches the ContentElement's DependencyObjectType private static DependencyObjectType ContentElementType = DependencyObjectType.FromSystemTypeInternal(typeof(ContentElement)); #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
- PrintPreviewDialog.cs
- TemplateNameScope.cs
- GlyphCache.cs
- SuppressIldasmAttribute.cs
- ListViewGroupCollectionEditor.cs
- TextProperties.cs
- CodeLinePragma.cs
- UxThemeWrapper.cs
- SchemaConstraints.cs
- CompilationSection.cs
- KeyFrames.cs
- EventRoute.cs
- HttpAsyncResult.cs
- Region.cs
- CounterCreationData.cs
- XmlSerializerVersionAttribute.cs
- AddInActivator.cs
- List.cs
- UserControl.cs
- UserControlBuildProvider.cs
- ProjectedSlot.cs
- DataPagerFieldItem.cs
- DefaultBindingPropertyAttribute.cs
- ExpressionList.cs
- InternalConfigConfigurationFactory.cs
- BaseAsyncResult.cs
- OutputCacheProfileCollection.cs
- TableRow.cs
- Panel.cs
- WSSecurityXXX2005.cs
- SafeCoTaskMem.cs
- InputScopeConverter.cs
- Utils.cs
- SmiTypedGetterSetter.cs
- BitmapEffectDrawingContextWalker.cs
- HeaderLabel.cs
- Clipboard.cs
- IgnoreFileBuildProvider.cs
- SerialReceived.cs
- VoiceChangeEventArgs.cs
- PointCollectionConverter.cs
- _NegotiateClient.cs
- DesignTimeVisibleAttribute.cs
- IImplicitResourceProvider.cs
- MetafileHeader.cs
- RealProxy.cs
- CustomWebEventKey.cs
- Container.cs
- OutputCacheProfile.cs
- SqlCacheDependencyDatabaseCollection.cs
- Underline.cs
- TypeNameParser.cs
- TypeTypeConverter.cs
- TreeViewTemplateSelector.cs
- AttributeQuery.cs
- IEnumerable.cs
- Preprocessor.cs
- SwitchElementsCollection.cs
- HtmlTextBoxAdapter.cs
- GradientStop.cs
- ChildrenQuery.cs
- HttpBindingExtension.cs
- ColorBlend.cs
- EncoderExceptionFallback.cs
- handlecollector.cs
- TabControlAutomationPeer.cs
- SQLBytesStorage.cs
- GPPOINTF.cs
- RenderingEventArgs.cs
- WriterOutput.cs
- KeyMatchBuilder.cs
- InlineCollection.cs
- SharedUtils.cs
- StrokeNodeEnumerator.cs
- Trace.cs
- DataViewSetting.cs
- SqlSelectStatement.cs
- SqlError.cs
- ListDictionary.cs
- SqlExpander.cs
- StylusTip.cs
- QilBinary.cs
- OperationCanceledException.cs
- FileEnumerator.cs
- TouchEventArgs.cs
- WindowsFormsHelpers.cs
- GetLedgerEntryForRecipientRequest.cs
- PointAnimationUsingPath.cs
- StackBuilderSink.cs
- EventLogEntryCollection.cs
- basenumberconverter.cs
- Positioning.cs
- InstanceOwner.cs
- UnknownWrapper.cs
- SimpleWorkerRequest.cs
- SqlDependencyListener.cs
- X509ThumbprintKeyIdentifierClause.cs
- DataMemberAttribute.cs
- IFormattable.cs
- ZoneIdentityPermission.cs