|
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Diagnostics;
namespace WPScadaControlsV2
{
public class LinearBarIndicator:BarIndicator
{
public LinearBarIndicator()
{
DefaultStyleKey = typeof(LinearBarIndicator);
}
protected override void OnValueChanged(double newVal, double oldVal)
{
//every time the value changes set the width and the hight of
//the indicator.
//setting these properties will trigger the measure and arrange passes
LinearScale scale = Owner as LinearScale;
if (scale != null)
{
Size sz = GetIndicatorSize(scale);
Debug.WriteLine("val changed: "+sz);
Width = sz.Width;
Height = sz.Height;
}
}
protected override Size MeasureOverride(Size availableSize)
{
//call the base version to set the owner
base.MeasureOverride(availableSize);
Size size = new Size();
//get the desired size of the indicator based on the owner size
LinearScale owner = Owner as LinearScale;
if (owner != null)
{
size = GetIndicatorSize(owner);
}
return size;
}
protected override Size ArrangeOverride(Size arrangeBounds)
{//with every arrange pass the size of the indicator should
//be set again. this is important if the orientation is
//vertical as the start position changes every time the value changes
//so the indicator should be rearranged
LinearScale scale = Owner as LinearScale;
Size sz = base.ArrangeOverride(arrangeBounds);
if (scale != null)
{
//reset the indicator size after each arrange phase
sz = GetIndicatorSize(scale);
Width = sz.Width;
Height = sz.Height;
Point pos = scale.GetIndicatorOffset(this);
TranslateTransform tt = new TranslateTransform();
tt.X = pos.X;
tt.Y = pos.Y;
this.RenderTransform = tt;
}
return sz;
}
private Size GetIndicatorSize(LinearScale owner)
{//gets the size of the indicator based on the current value and the
//owner dimensions
double width = 0, height = 0;
if (owner.Orientation == Orientation.Horizontal)
{
height = BarThickness;
width = GetExtent(owner.ActualWidth, Value, owner.Maximum, owner.Minimum);
}
else
{
width = BarThickness;
height = GetExtent(owner.ActualHeight, Value, owner.Maximum, owner.Minimum);
}
return new Size(width, height);
}
//gets the length the indicator should have
private double GetExtent(double length, double value, double max, double min)
{
return length * (value - min) / (max - min);
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.