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.
262 lines
9.3 KiB
262 lines
9.3 KiB
using System;
|
|
using System.Globalization;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media.Animation;
|
|
using System.Windows.Threading;
|
|
|
|
namespace HMIControl
|
|
{
|
|
public class ZoomSlideControl : Control
|
|
{
|
|
// Fields
|
|
private static DependencyProperty ContOpacityProperty;
|
|
private DispatcherTimer dispatcherTimer;
|
|
private bool isVisualActive = true;
|
|
private static DependencyProperty MaxZoomTickProperty;
|
|
private static DependencyProperty MinZoomTickProperty;
|
|
private bool mouseIsOver;
|
|
private static DependencyProperty TargetElementProperty;
|
|
private const int TICKS_BEFORE_FADE = 6;
|
|
private int ticksSinceMouseOut;
|
|
private ZoomBoxPanel zoomBox;
|
|
private static DependencyProperty ZoomProperty;
|
|
private static DependencyProperty ZoomTickProperty;
|
|
|
|
// Methods
|
|
static ZoomSlideControl()
|
|
{
|
|
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(ZoomSlideControl), new FrameworkPropertyMetadata(typeof(ZoomSlideControl)));
|
|
ContOpacityProperty = DependencyProperty.Register("ContOpacity", typeof(double), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.AffectsRender, null, null), null);
|
|
ZoomTickProperty = DependencyProperty.Register("ZoomTick", typeof(double), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(50.0, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.AffectsRender, null, null), null);
|
|
MinZoomTickProperty = DependencyProperty.Register("MinZoomTick", typeof(double), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.AffectsRender, null, null), null);
|
|
MaxZoomTickProperty = DependencyProperty.Register("MaxZoomTick", typeof(double), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(100.0, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.AffectsRender, null, null), null);
|
|
ZoomProperty = DependencyProperty.Register("Zoom", typeof(double), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(100.0, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.AffectsRender, null, null), null);
|
|
TargetElementProperty = DependencyProperty.Register("TargetElement", typeof(UIElement), typeof(ZoomSlideControl), new FrameworkPropertyMetadata(null), null);
|
|
}
|
|
|
|
public ZoomSlideControl()
|
|
{
|
|
this.SetUpCommands();
|
|
}
|
|
|
|
private void DecreaseZoomCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
|
|
{
|
|
e.CanExecute = this.ZoomTick > this.MinZoomTick;
|
|
}
|
|
|
|
private void DecreaseZoomCommand_Executed(object sender, ExecutedRoutedEventArgs e)
|
|
{
|
|
if (this.zoomBox != null)
|
|
{
|
|
NavigationCommands.DecreaseZoom.Execute(null, this.zoomBox);
|
|
}
|
|
this.FocusOnTarget();
|
|
}
|
|
|
|
private void dispatcherTimer_Tick(object sender, EventArgs e)
|
|
{
|
|
this.ticksSinceMouseOut++;
|
|
if ((!this.mouseIsOver && this.isVisualActive) && (this.ticksSinceMouseOut >= 6))
|
|
{
|
|
this.setControlVisualActive(false, true);
|
|
}
|
|
}
|
|
|
|
private void FocusOnTarget()
|
|
{
|
|
if (this.TargetElement != null)
|
|
{
|
|
this.TargetElement.Focus();
|
|
}
|
|
}
|
|
|
|
private void IncreaseZoomCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
|
|
{
|
|
e.CanExecute = this.ZoomTick < this.MaxZoomTick;
|
|
}
|
|
|
|
private void IncreaseZoomCommand_Executed(object sender, ExecutedRoutedEventArgs e)
|
|
{
|
|
if (this.zoomBox != null)
|
|
{
|
|
NavigationCommands.IncreaseZoom.Execute(null, this.zoomBox);
|
|
}
|
|
this.FocusOnTarget();
|
|
}
|
|
|
|
public override void OnApplyTemplate()
|
|
{
|
|
base.OnApplyTemplate();
|
|
this.setControlVisualActive(false, false);
|
|
this.SetUpTimer();
|
|
}
|
|
|
|
protected override void OnMouseEnter(MouseEventArgs e)
|
|
{
|
|
this.mouseIsOver = true;
|
|
this.setControlVisualActive(true, true);
|
|
base.OnMouseEnter(e);
|
|
}
|
|
|
|
protected override void OnMouseLeave(MouseEventArgs e)
|
|
{
|
|
this.mouseIsOver = false;
|
|
this.ticksSinceMouseOut = 0;
|
|
base.OnMouseLeave(e);
|
|
}
|
|
|
|
private void setControlVisualActive(bool isOn, bool annimate)
|
|
{
|
|
if (this.isVisualActive != isOn)
|
|
{
|
|
this.isVisualActive = isOn;
|
|
if (!annimate)
|
|
{
|
|
this.ContOpacity = this.isVisualActive ? 1.0 : 0.25;
|
|
}
|
|
else
|
|
{
|
|
double num = this.isVisualActive ? ((double)450) : ((double)0x7d0);
|
|
double toValue = this.isVisualActive ? 1.0 : 0.25;
|
|
DoubleAnimation animation = new DoubleAnimation(toValue, TimeSpan.FromMilliseconds(num));
|
|
base.BeginAnimation(ContOpacityProperty, animation, HandoffBehavior.SnapshotAndReplace);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetUpCommands()
|
|
{
|
|
CommandBinding commandBinding = new CommandBinding(NavigationCommands.Zoom, new ExecutedRoutedEventHandler(this.ZoomCommand_Executed), new CanExecuteRoutedEventHandler(this.ZoomCommand_CanExecute));
|
|
base.CommandBindings.Add(commandBinding);
|
|
commandBinding = new CommandBinding(NavigationCommands.IncreaseZoom, new ExecutedRoutedEventHandler(this.IncreaseZoomCommand_Executed), new CanExecuteRoutedEventHandler(this.IncreaseZoomCommand_CanExecute));
|
|
base.CommandBindings.Add(commandBinding);
|
|
commandBinding = new CommandBinding(NavigationCommands.DecreaseZoom, new ExecutedRoutedEventHandler(this.DecreaseZoomCommand_Executed), new CanExecuteRoutedEventHandler(this.DecreaseZoomCommand_CanExecute));
|
|
base.CommandBindings.Add(commandBinding);
|
|
}
|
|
|
|
private void SetUpTimer()
|
|
{
|
|
this.dispatcherTimer = new DispatcherTimer();
|
|
this.dispatcherTimer.Tick += new EventHandler(this.dispatcherTimer_Tick);
|
|
this.dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
|
|
this.dispatcherTimer.Start();
|
|
}
|
|
|
|
private void ZoomCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
|
|
{
|
|
e.CanExecute = true;
|
|
}
|
|
|
|
private void ZoomCommand_Executed(object sender, ExecutedRoutedEventArgs e)
|
|
{
|
|
if (this.zoomBox != null)
|
|
{
|
|
this.zoomBox.ZoomMode = ZoomBoxPanel.eZoomMode.FitPage;
|
|
}
|
|
this.FocusOnTarget();
|
|
}
|
|
|
|
// Properties
|
|
public double ContOpacity
|
|
{
|
|
get
|
|
{
|
|
return (double)base.GetValue(ContOpacityProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(ContOpacityProperty, value);
|
|
}
|
|
}
|
|
|
|
public double MaxZoomTick
|
|
{
|
|
get
|
|
{
|
|
return (double)base.GetValue(MaxZoomTickProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(MaxZoomTickProperty, value);
|
|
}
|
|
}
|
|
|
|
public double MinZoomTick
|
|
{
|
|
get
|
|
{
|
|
return (double)base.GetValue(MinZoomTickProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(MinZoomTickProperty, value);
|
|
}
|
|
}
|
|
|
|
public UIElement TargetElement
|
|
{
|
|
get
|
|
{
|
|
return (UIElement)base.GetValue(TargetElementProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(TargetElementProperty, value);
|
|
}
|
|
}
|
|
|
|
public double Zoom
|
|
{
|
|
get
|
|
{
|
|
return (double)base.GetValue(ZoomProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(ZoomProperty, value);
|
|
}
|
|
}
|
|
|
|
public ZoomBoxPanel ZoomBox
|
|
{
|
|
set
|
|
{
|
|
this.zoomBox = value;
|
|
}
|
|
}
|
|
|
|
public double ZoomTick
|
|
{
|
|
get
|
|
{
|
|
return (double)base.GetValue(ZoomTickProperty);
|
|
}
|
|
set
|
|
{
|
|
base.SetValue(ZoomTickProperty, value);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class ZoomSlideDisplayConverter : IValueConverter
|
|
{
|
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
|
{
|
|
double? nullable = value as double?;
|
|
if (nullable.HasValue)
|
|
{
|
|
return string.Format("{0:0.}%", nullable);
|
|
}
|
|
return "0%";
|
|
}
|
|
|
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
|
{
|
|
throw new NotSupportedException("unexpected Convertback");
|
|
}
|
|
}
|
|
|
|
}
|
|
|