Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / System / Windows / Documents / Adorner.cs / 1 / Adorner.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Info needed to draw decorations on objects
//
// See spec at http://avalon/uis/Specs/AdornerLayer%20Spec.htm
//
// History:
// 10/01/2003 : psarrett - Created
// 10/22/2003 : psarrett - modified as per current spec
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Input;
using System.Windows.Threading;
using MS.Internal; // DoubleUtil
namespace System.Windows.Documents
{
///
/// An Adorner is a UIElement "attached" to another UIElement. Adorners render
/// on an AdornerLayer, which puts them higher in the Z-order than the element
/// to which they are attached so they visually appear on top of that element.
/// By default, the AdornerLayer positions an Adorner at the upper-left corner
/// of the element it adorns. However, the AdornerLayer passes the Adorner its
/// proposed transform, and the Adorner can modify that proposed transform as it
/// wishes.
///
/// Since Adorners are UIElements, they can respond to input events.
///
public abstract class Adorner : FrameworkElement
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Constructor
///
protected Adorner(UIElement adornedElement)
{
if (adornedElement == null)
throw new ArgumentNullException("adornedElement");
_adornedElement = adornedElement;
_isClipEnabled = false;
// Bug 1383424: We need to make sure our FlowDirection is always that of our adorned element.
// Need to allow derived class constructor to execute first
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(CreateFlowDirectionBinding), this);
}
#endregion Constructors
//------------------------------------------------------
//
// Protected Methods
//
//-----------------------------------------------------
#region Protected Methods
///
/// Measure adorner. Default behavior is to size to match the adorned element.
///
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize;
desiredSize = new Size(AdornedElement.RenderSize.Width, AdornedElement.RenderSize.Height);
int count = this.VisualChildrenCount;
for (int i = 0; i < count; i++)
{
UIElement ch = this.GetVisualChild(i) as UIElement;
if (ch != null)
{
ch.Measure(desiredSize);
}
}
return desiredSize;
}
///
/// Override of .
///
/// null
///
/// Clip gets generated before transforms are applied, which means that
/// Adorners can get inappropriately clipped if they draw outside of the bounding rect
/// of the element they're adorning. This is against the Adorner philosophy of being
/// topmost, so we choose to ignore clip instead.
protected override Geometry GetLayoutClip(Size layoutSlotSize)
{
return null;
}
#endregion Protected Methods
//------------------------------------------------------
//
// Public Methods
//
//------------------------------------------------------
#region Public Methods
///
/// Adorners don't always want to be transformed in the same way as the elements they
/// adorn. Adorners which adorn points, such as resize handles, want to be translated
/// and rotated but not scaled. Adorners adorning an object, like a marquee, may want
/// all transforms. This method is called by AdornerLayer to allow the adorner to
/// filter out the transforms it doesn't want and return a new transform with just the
/// transforms it wants applied. An adorner can also add an additional translation
/// transform at this time, allowing it to be positioned somewhere other than the upper
/// left corner of its adorned element.
///
/// The transform applied to the object the adorner adorns
/// Transform to apply to the adorner
public virtual GeneralTransform GetDesiredTransform(GeneralTransform transform)
{
return transform;
}
#endregion Public Methods
//-----------------------------------------------------
//
// Public Properties
//
//------------------------------------------------------
#region Public Properties
///
/// Gets or sets the clip of this Visual.
/// Needed by AdornerLayer
///
internal Geometry AdornerClip
{
get
{
return Clip;
}
set
{
Clip = value;
}
}
///
/// Gets or sets the transform of this Visual.
/// Needed by AdornerLayer
///
internal Transform AdornerTransform
{
get
{
return RenderTransform;
}
set
{
RenderTransform = value;
}
}
///
/// UIElement this Adorner adorns.
///
public UIElement AdornedElement
{
get { return _adornedElement; }
}
///
/// If set to true, the adorner will be clipped using the same clip geometry as the
/// AdornedElement. This is expensive, and therefore should not normally be used.
/// Defaults to false.
///
public bool IsClipEnabled
{
get
{
return _isClipEnabled;
}
set
{
_isClipEnabled = value;
InvalidateArrange();
AdornerLayer.GetAdornerLayer(_adornedElement).InvalidateArrange();
}
}
#endregion Public Properties
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
// Callback for binding the FlowDirection property.
private static object CreateFlowDirectionBinding(object o)
{
Adorner adorner = (Adorner)o;
Binding binding = new Binding("FlowDirection");
binding.Mode = BindingMode.OneWay;
binding.Source = adorner.AdornedElement;
adorner.SetBinding(FlowDirectionProperty, binding);
return null;
}
///
/// Says if the Adorner needs update based on the
/// previously cached size if the AdornedElement.
///
internal virtual bool NeedsUpdate(Size oldSize)
{
return !DoubleUtil.AreClose(AdornedElement.RenderSize, oldSize);
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
private readonly UIElement _adornedElement;
private bool _isClipEnabled;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Info needed to draw decorations on objects
//
// See spec at http://avalon/uis/Specs/AdornerLayer%20Spec.htm
//
// History:
// 10/01/2003 : psarrett - Created
// 10/22/2003 : psarrett - modified as per current spec
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Input;
using System.Windows.Threading;
using MS.Internal; // DoubleUtil
namespace System.Windows.Documents
{
///
/// An Adorner is a UIElement "attached" to another UIElement. Adorners render
/// on an AdornerLayer, which puts them higher in the Z-order than the element
/// to which they are attached so they visually appear on top of that element.
/// By default, the AdornerLayer positions an Adorner at the upper-left corner
/// of the element it adorns. However, the AdornerLayer passes the Adorner its
/// proposed transform, and the Adorner can modify that proposed transform as it
/// wishes.
///
/// Since Adorners are UIElements, they can respond to input events.
///
public abstract class Adorner : FrameworkElement
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Constructor
///
protected Adorner(UIElement adornedElement)
{
if (adornedElement == null)
throw new ArgumentNullException("adornedElement");
_adornedElement = adornedElement;
_isClipEnabled = false;
// Bug 1383424: We need to make sure our FlowDirection is always that of our adorned element.
// Need to allow derived class constructor to execute first
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(CreateFlowDirectionBinding), this);
}
#endregion Constructors
//------------------------------------------------------
//
// Protected Methods
//
//-----------------------------------------------------
#region Protected Methods
///
/// Measure adorner. Default behavior is to size to match the adorned element.
///
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize;
desiredSize = new Size(AdornedElement.RenderSize.Width, AdornedElement.RenderSize.Height);
int count = this.VisualChildrenCount;
for (int i = 0; i < count; i++)
{
UIElement ch = this.GetVisualChild(i) as UIElement;
if (ch != null)
{
ch.Measure(desiredSize);
}
}
return desiredSize;
}
///
/// Override of .
///
/// null
///
/// Clip gets generated before transforms are applied, which means that
/// Adorners can get inappropriately clipped if they draw outside of the bounding rect
/// of the element they're adorning. This is against the Adorner philosophy of being
/// topmost, so we choose to ignore clip instead.
protected override Geometry GetLayoutClip(Size layoutSlotSize)
{
return null;
}
#endregion Protected Methods
//------------------------------------------------------
//
// Public Methods
//
//------------------------------------------------------
#region Public Methods
///
/// Adorners don't always want to be transformed in the same way as the elements they
/// adorn. Adorners which adorn points, such as resize handles, want to be translated
/// and rotated but not scaled. Adorners adorning an object, like a marquee, may want
/// all transforms. This method is called by AdornerLayer to allow the adorner to
/// filter out the transforms it doesn't want and return a new transform with just the
/// transforms it wants applied. An adorner can also add an additional translation
/// transform at this time, allowing it to be positioned somewhere other than the upper
/// left corner of its adorned element.
///
/// The transform applied to the object the adorner adorns
/// Transform to apply to the adorner
public virtual GeneralTransform GetDesiredTransform(GeneralTransform transform)
{
return transform;
}
#endregion Public Methods
//-----------------------------------------------------
//
// Public Properties
//
//------------------------------------------------------
#region Public Properties
///
/// Gets or sets the clip of this Visual.
/// Needed by AdornerLayer
///
internal Geometry AdornerClip
{
get
{
return Clip;
}
set
{
Clip = value;
}
}
///
/// Gets or sets the transform of this Visual.
/// Needed by AdornerLayer
///
internal Transform AdornerTransform
{
get
{
return RenderTransform;
}
set
{
RenderTransform = value;
}
}
///
/// UIElement this Adorner adorns.
///
public UIElement AdornedElement
{
get { return _adornedElement; }
}
///
/// If set to true, the adorner will be clipped using the same clip geometry as the
/// AdornedElement. This is expensive, and therefore should not normally be used.
/// Defaults to false.
///
public bool IsClipEnabled
{
get
{
return _isClipEnabled;
}
set
{
_isClipEnabled = value;
InvalidateArrange();
AdornerLayer.GetAdornerLayer(_adornedElement).InvalidateArrange();
}
}
#endregion Public Properties
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
// Callback for binding the FlowDirection property.
private static object CreateFlowDirectionBinding(object o)
{
Adorner adorner = (Adorner)o;
Binding binding = new Binding("FlowDirection");
binding.Mode = BindingMode.OneWay;
binding.Source = adorner.AdornedElement;
adorner.SetBinding(FlowDirectionProperty, binding);
return null;
}
///
/// Says if the Adorner needs update based on the
/// previously cached size if the AdornedElement.
///
internal virtual bool NeedsUpdate(Size oldSize)
{
return !DoubleUtil.AreClose(AdornedElement.RenderSize, oldSize);
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
private readonly UIElement _adornedElement;
private bool _isClipEnabled;
#endregion Private Fields
}
}
// 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
- PathData.cs
- RootBuilder.cs
- ApplicationServiceManager.cs
- DataRowComparer.cs
- WebCategoryAttribute.cs
- ComboBoxAutomationPeer.cs
- Quaternion.cs
- PropertyFilterAttribute.cs
- SelectionUIHandler.cs
- OdbcEnvironment.cs
- LookupBindingPropertiesAttribute.cs
- ProcessInfo.cs
- AsyncOperationContext.cs
- PagedDataSource.cs
- ChtmlTextWriter.cs
- ImageFormat.cs
- DataGridViewUtilities.cs
- EntityDataSourceDataSelectionPanel.cs
- SqlMethodCallConverter.cs
- FixedTextBuilder.cs
- PropertyNames.cs
- RegexStringValidator.cs
- PrincipalPermission.cs
- EventManager.cs
- InvalidCommandTreeException.cs
- WebPartConnection.cs
- RadialGradientBrush.cs
- WebPartConnectionsCancelEventArgs.cs
- SqlConnectionPoolProviderInfo.cs
- TabControl.cs
- FileLoadException.cs
- PtsHelper.cs
- IconBitmapDecoder.cs
- WebDescriptionAttribute.cs
- Help.cs
- ExpressionBuilder.cs
- EngineSite.cs
- MetaChildrenColumn.cs
- Zone.cs
- designeractionlistschangedeventargs.cs
- DataObjectPastingEventArgs.cs
- XmlSchemas.cs
- MorphHelpers.cs
- GZipUtils.cs
- TypeNameConverter.cs
- TextRange.cs
- ConfigurationErrorsException.cs
- smtppermission.cs
- ListParaClient.cs
- HitTestFilterBehavior.cs
- XamlStream.cs
- ACE.cs
- TextFormatterImp.cs
- HasCopySemanticsAttribute.cs
- ArrowControl.xaml.cs
- VerificationAttribute.cs
- CodeStatement.cs
- BuildResultCache.cs
- WorkItem.cs
- CommandDevice.cs
- LogExtent.cs
- ActiveXContainer.cs
- TypedElement.cs
- BufferModesCollection.cs
- KeyFrames.cs
- TypedTableBaseExtensions.cs
- Vector3DConverter.cs
- IDictionary.cs
- DbConnectionClosed.cs
- InternalUserCancelledException.cs
- CodeMethodInvokeExpression.cs
- ProfileBuildProvider.cs
- PersonalizableTypeEntry.cs
- DesignerAdapterAttribute.cs
- Enum.cs
- QueryResults.cs
- AuthorizationRule.cs
- DataGridViewSelectedCellCollection.cs
- SchemaCollectionPreprocessor.cs
- ProcessHostFactoryHelper.cs
- SQLMembershipProvider.cs
- ScriptIgnoreAttribute.cs
- SecurityPolicySection.cs
- BufferModesCollection.cs
- ImageCodecInfoPrivate.cs
- LabelAutomationPeer.cs
- ProfileService.cs
- ConnectivityStatus.cs
- UnhandledExceptionEventArgs.cs
- ElasticEase.cs
- AsyncOperationManager.cs
- HScrollProperties.cs
- ThicknessAnimation.cs
- _Semaphore.cs
- ResolveNameEventArgs.cs
- AuthorizationRule.cs
- COMException.cs
- CancellationHandlerDesigner.cs
- DeferredReference.cs
- SoapClientMessage.cs