All the controls missing in WPF. Over 1 million downloads.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
7.0 KiB

/************************************************************************
Extended WPF Toolkit
Copyright (C) 2010-2012 Xceed Software Inc.
This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
This program can be provided to you by Xceed Software Inc. under a
proprietary commercial license agreement for use in non-Open Source
projects. The commercial version of Extended WPF Toolkit also includes
priority technical support, commercial updates, and many additional
useful WPF controls if you license Xceed Business Suite for WPF.
Visit http://xceed.com and follow @datagrid on Twitter.
**********************************************************************/
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Xceed.Wpf.Toolkit.Core.Utilities;
namespace Xceed.Wpf.Toolkit
{
[TemplatePart( Name = PART_VisualBrush, Type = typeof( VisualBrush ) )]
public class Magnifier : Control
{
private const double DEFAULT_SIZE = 100d;
private const string PART_VisualBrush = "PART_VisualBrush";
#region Private Members
private VisualBrush _visualBrush = new VisualBrush();
#endregion //Private Members
#region Properties
#region FrameType
public static readonly DependencyProperty FrameTypeProperty = DependencyProperty.Register( "FrameType", typeof( FrameType ), typeof( Magnifier ), new UIPropertyMetadata( FrameType.Circle, OnFrameTypeChanged ) );
public FrameType FrameType
{
get
{
return ( FrameType )GetValue( FrameTypeProperty );
}
set
{
SetValue( FrameTypeProperty, value );
}
}
private static void OnFrameTypeChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
Magnifier m = ( Magnifier )d;
m.OnFrameTypeChanged( ( FrameType )e.OldValue, ( FrameType )e.NewValue );
}
protected virtual void OnFrameTypeChanged( FrameType oldValue, FrameType newValue )
{
this.UpdateSizeFromRadius();
}
#endregion //FrameType
#region Radius
public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register( "Radius", typeof( double ), typeof( Magnifier ), new FrameworkPropertyMetadata( ( Magnifier.DEFAULT_SIZE / 2 ), new PropertyChangedCallback( OnRadiusPropertyChanged ) ) );
public double Radius
{
get
{
return ( double )GetValue( RadiusProperty );
}
set
{
SetValue( RadiusProperty, value );
}
}
private static void OnRadiusPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
Magnifier m = ( Magnifier )d;
m.OnRadiusChanged( e );
}
protected virtual void OnRadiusChanged( DependencyPropertyChangedEventArgs e )
{
this.UpdateSizeFromRadius();
}
#endregion
#region Target
public static readonly DependencyProperty TargetProperty = DependencyProperty.Register( "Target", typeof( UIElement ), typeof( Magnifier ) );
public UIElement Target
{
get
{
return ( UIElement )GetValue( TargetProperty );
}
set
{
SetValue( TargetProperty, value );
}
}
#endregion //Target
#region ViewBox
internal Rect ViewBox
{
get
{
return _visualBrush.Viewbox;
}
set
{
_visualBrush.Viewbox = value;
}
}
#endregion
#region ZoomFactor
public static readonly DependencyProperty ZoomFactorProperty = DependencyProperty.Register( "ZoomFactor", typeof( double ), typeof( Magnifier ), new FrameworkPropertyMetadata( 0.5, OnZoomFactorPropertyChanged, OnCoerceZoomFactorProperty ) );
public double ZoomFactor
{
get
{
return ( double )GetValue( ZoomFactorProperty );
}
set
{
SetValue( ZoomFactorProperty, value );
}
}
private static void OnZoomFactorPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
Magnifier m = ( Magnifier )d;
m.OnZoomFactorChanged( e );
}
protected virtual void OnZoomFactorChanged( DependencyPropertyChangedEventArgs e )
{
ResolveViewBox();
}
private static object OnCoerceZoomFactorProperty( DependencyObject d, object value )
{
Magnifier m = ( Magnifier )d;
return m.OnCoerceZoomFactor( value );
}
protected virtual object OnCoerceZoomFactor( object value )
{
double zoomFactor = ( double )value;
if( zoomFactor > 1 )
zoomFactor = 1;
else if( zoomFactor < 0 )
zoomFactor = 0;
return zoomFactor;
}
#endregion //ZoomFactor
#endregion //Properties
#region Constructors
/// <summary>
/// Initializes static members of the <see cref="Magnifier"/> class.
/// </summary>
static Magnifier()
{
DefaultStyleKeyProperty.OverrideMetadata( typeof( Magnifier ), new FrameworkPropertyMetadata( typeof( Magnifier ) ) );
HeightProperty.OverrideMetadata( typeof( Magnifier ), new FrameworkPropertyMetadata( Magnifier.DEFAULT_SIZE ) );
WidthProperty.OverrideMetadata( typeof( Magnifier ), new FrameworkPropertyMetadata( Magnifier.DEFAULT_SIZE ) );
}
public Magnifier()
{
this.SizeChanged += new SizeChangedEventHandler( OnSizeChangedEvent );
}
private void OnSizeChangedEvent( object sender, SizeChangedEventArgs e )
{
ResolveViewBox();
}
private void UpdateSizeFromRadius()
{
if( this.FrameType == Toolkit.FrameType.Circle )
{
double newSize = Radius * 2;
if(!DoubleHelper.AreVirtuallyEqual( Width, newSize ))
{
Width = newSize;
}
if(!DoubleHelper.AreVirtuallyEqual( Height, newSize ))
{
Height = newSize;
}
}
}
#endregion
#region Base Class Overrides
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
VisualBrush newBrush = GetTemplateChild( PART_VisualBrush ) as VisualBrush;
// Just create a brush as placeholder even if there is no such brush.
// This avoids having to "if" each access to the _visualBrush member.
// Do not keep the current _visualBrush whatsoever to avoid memory leaks.
if( newBrush == null )
{
newBrush = new VisualBrush();
}
newBrush.Viewbox = _visualBrush.Viewbox;
_visualBrush = newBrush;
}
#endregion // Base Class Overrides
#region Methods
private void ResolveViewBox()
{
if( !IsInitialized )
return;
ViewBox = new Rect(
ViewBox.Location,
new Size( ActualWidth * ZoomFactor , ActualHeight * ZoomFactor ) );
}
#endregion //Methods
}
}