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.
224 lines
7.2 KiB
224 lines
7.2 KiB
using System;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace Microsoft.Windows.Controls
|
|
{
|
|
public class Magnifier : Control
|
|
{
|
|
#region Properties
|
|
|
|
#region DefaultSize
|
|
|
|
internal Size DefaultSize
|
|
{
|
|
get
|
|
{
|
|
switch (FrameType)
|
|
{
|
|
case FrameType.Circle:
|
|
return new Size(2 * Radius, 2 * Radius);
|
|
case FrameType.Rectangle:
|
|
return new Size(Width, Height);
|
|
default:
|
|
return Size.Empty;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion //DefaultSize
|
|
|
|
#region FrameWidth
|
|
|
|
public static readonly DependencyProperty FrameWidthProperty = DependencyProperty.Register("FrameWidth", typeof(double), typeof(Magnifier), new UIPropertyMetadata(50.0));
|
|
internal double FrameWidth
|
|
{
|
|
get { return (double)GetValue(FrameWidthProperty); }
|
|
set { SetValue(FrameWidthProperty, value); }
|
|
}
|
|
|
|
#endregion //MagnifierWidth
|
|
|
|
#region FrameHeight
|
|
|
|
public static readonly DependencyProperty FrameHeightProperty = DependencyProperty.Register("FrameHeight", typeof(double), typeof(Magnifier), new UIPropertyMetadata(50.0));
|
|
internal double FrameHeight
|
|
{
|
|
get { return (double)GetValue(FrameHeightProperty); }
|
|
set { SetValue(FrameHeightProperty, value); }
|
|
}
|
|
|
|
#endregion //FrameHeight
|
|
|
|
#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)
|
|
{
|
|
if (newValue == Controls.FrameType.Circle)
|
|
{
|
|
Height = DefaultSize.Height;
|
|
Width = DefaultSize.Width;
|
|
}
|
|
|
|
ResolveViewBox();
|
|
}
|
|
|
|
#endregion //FrameType
|
|
|
|
#region Radius
|
|
|
|
public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(Magnifier), new FrameworkPropertyMetadata(50.0, 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)
|
|
{
|
|
ResolveViewBox();
|
|
}
|
|
|
|
#endregion //Radius
|
|
|
|
#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
|
|
|
|
public static readonly DependencyProperty ViewBoxProperty = DependencyProperty.Register("ViewBox", typeof(Rect), typeof(Magnifier), new FrameworkPropertyMetadata(default(Rect)));
|
|
internal Rect ViewBox
|
|
{
|
|
get { return (Rect)GetValue(ViewBoxProperty); }
|
|
set { SetValue(ViewBoxProperty, value); }
|
|
}
|
|
|
|
#endregion //ViewBox
|
|
|
|
#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(100.0));
|
|
WidthProperty.OverrideMetadata(typeof(Magnifier), new FrameworkPropertyMetadata(100.0));
|
|
}
|
|
|
|
public Magnifier()
|
|
{
|
|
ResolveViewBox();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Base Class Overrides
|
|
|
|
public override void OnApplyTemplate()
|
|
{
|
|
base.OnApplyTemplate();
|
|
|
|
if (FrameType == Controls.FrameType.Circle)
|
|
{
|
|
Height = DefaultSize.Height;
|
|
Width = DefaultSize.Width;
|
|
}
|
|
|
|
ResolveViewBox();
|
|
}
|
|
|
|
#endregion // Base Class Overrides
|
|
|
|
#region Methods
|
|
|
|
private void ResolveViewBox()
|
|
{
|
|
if (!IsInitialized)
|
|
return;
|
|
|
|
double correction = (BorderThickness.Bottom + BorderThickness.Left + BorderThickness.Right + BorderThickness.Top == 0) ? 1 : 0;
|
|
|
|
double width = DefaultSize.Width * ZoomFactor;
|
|
double height = DefaultSize.Height * ZoomFactor;
|
|
|
|
FrameWidth = DefaultSize.Width - correction;
|
|
FrameHeight = DefaultSize.Height - correction;
|
|
|
|
ViewBox = new Rect(ViewBox.Location, new Size(width, height));
|
|
}
|
|
|
|
#endregion //Methods
|
|
|
|
}
|
|
}
|
|
|