C# SCADA
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.

399 lines
15 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
namespace HMIControl
{
[Startable]
public class HMILable : HMIControlBase
{
public static DependencyProperty BorderStyleProperty = DependencyProperty.Register("BorderStyle", typeof(BorderStyle), typeof(HMILable),
new FrameworkPropertyMetadata(BorderStyle.None, FrameworkPropertyMetadataOptions.AffectsRender));
public static DependencyProperty TextAlignmentProperty = DependencyProperty.Register("TextAlignment", typeof(TextAlignment), typeof(HMILable),
new FrameworkPropertyMetadata(TextAlignment.Center, FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(HMILable),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty UnitProperty = DependencyProperty.Register("Unit", typeof(string), typeof(HMILable),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender));
public static DependencyProperty StringFormatProperty = DependencyProperty.Register("StringFormat", typeof(string), typeof(HMILable));
public override string[] GetActions()
{
return new string[] { TagActions.VISIBLE, TagActions.CAPTION, TagActions.DEVICENAME, TagActions.TEXT };
}
protected override void OnRender(DrawingContext drawingContext)
{
//base.OnRender(drawingContext);
double width = this.ActualWidth;
double height = this.ActualHeight;
double bevel = height * 0.1;
Color color = Colors.Black;
if (this.Background is SolidColorBrush)
color = (this.Background as SolidColorBrush).Color;
Pen pen = new Pen(base.BorderBrush, base.BorderThickness.Left);
switch (this.BorderStyle)
{
case BorderStyle.Fixed3D:
Brush brush1 = color.CreateLinearTwoGradientsBrush(90.0, 80, -80);
Brush brush2 = color.CreateLinearTwoGradientsBrush(90.0, -80, 80);
drawingContext.DrawRectangle(brush1, null, new Rect(0, 0, width, height));
drawingContext.DrawRectangle(brush2, null, new Rect(bevel, bevel, width - 2 * bevel, height - 2 * bevel));
break;
case BorderStyle.FixedSingle:
drawingContext.DrawRectangle(this.Background, pen, new Rect(0, 0, width, height));
break;
//default:
// drawingContext.DrawRectangle(this.Background, pen, new Rect(0, 0, width, height));
// break;
}
string txt = this.Text;
if (!string.IsNullOrEmpty(txt))
{
FormattedText formattedText = new FormattedText(txt, System.Globalization.CultureInfo.CurrentUICulture, FlowDirection.LeftToRight,
new Typeface(base.FontFamily, base.FontStyle, base.FontWeight, base.FontStretch), base.FontSize, base.Foreground);
Point pt = new Point((this.TextAlignment == TextAlignment.Center ? (width - formattedText.Width) * 0.5 :
this.TextAlignment == TextAlignment.Left ? bevel : width - bevel - formattedText.Width), (height - formattedText.Height) * 0.5);
drawingContext.DrawText(formattedText, pt);
}
}
[Category("HMI")]
public BorderStyle BorderStyle
{
get
{
return (BorderStyle)base.GetValue(BorderStyleProperty);
}
set
{
base.SetValue(BorderStyleProperty, value);
}
}
[Category("Text")]
public TextAlignment TextAlignment
{
get
{
return (TextAlignment)base.GetValue(TextAlignmentProperty);
}
set
{
base.SetValue(TextAlignmentProperty, value);
}
}
[Category("HMI")]
public string Text
{
get
{
return (string)base.GetValue(TextProperty);
}
set
{
base.SetValue(TextProperty, value);
}
}
[Category("HMI")]
public string Unit
{
get
{
return (string)base.GetValue(UnitProperty);
}
set
{
base.SetValue(UnitProperty, value);
}
}
[Category("HMI")]
public string StringFormat
{
get
{
return (string)base.GetValue(StringFormatProperty);
}
set
{
base.SetValue(StringFormatProperty, value);
}
}
public override Action SetTagReader(string key, Delegate tagChanged)
{
var unit = " " + Unit;
switch (key)
{
case TagActions.TEXT:
var _funcText = tagChanged as Func<string>;
if (_funcText != null)
{
return delegate { this.Text = _funcText() + unit; };
}
else
{
var _funcFloat = tagChanged as Func<float>;
if (_funcFloat != null)
{
return delegate
{
var format = this.StringFormat;
this.Text = string.IsNullOrEmpty(format) ? _funcFloat().ToString() : _funcFloat().ToString(format) + unit;
};
}
else
{
var _funcint = tagChanged as Func<int>;
{
if (_funcint != null)
return delegate { this.Text = _funcint().ToString() + unit; };
else
{
var _funcbool = tagChanged as Func<bool>;
if (_funcbool != null)
{
return delegate { this.Text = _funcbool() ? "1" : "0" + unit; };
}
}
}
}
}
return null;
}
return base.SetTagReader(key, tagChanged);
}
}
public class HMIText : HMIControlBase, ITagWriter
{
public static DependencyProperty BorderStyleProperty = DependencyProperty.Register("BorderStyle", typeof(BorderStyle), typeof(HMIText),
new FrameworkPropertyMetadata(BorderStyle.None, FrameworkPropertyMetadataOptions.AffectsRender));
public static DependencyProperty TextAlignmentProperty = DependencyProperty.Register("TextAlignment", typeof(TextAlignment), typeof(HMIText),
new FrameworkPropertyMetadata(TextAlignment.Center, FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(HMIText),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty TagWriteTextProperty = DependencyProperty.Register("TagWriteText", typeof(string), typeof(HMIText));
public static readonly DependencyProperty IsPulseProperty = DependencyProperty.Register("IsPulse", typeof(bool), typeof(HMIText), new FrameworkPropertyMetadata(false));
public static DependencyProperty StringFormatProperty = DependencyProperty.Register("StringFormat", typeof(string), typeof(HMIText));
public override string[] GetActions()
{
return new string[] { TagActions.VISIBLE, TagActions.CAPTION, TagActions.DEVICENAME, TagActions.TEXT };
}
protected override void OnRender(DrawingContext drawingContext)
{
//base.OnRender(drawingContext);
double width = this.ActualWidth;
double height = this.ActualHeight;
double bevel = height * 0.1;
Color color = Colors.Black;
if (this.Background is SolidColorBrush)
color = (this.Background as SolidColorBrush).Color;
Pen pen = new Pen(base.BorderBrush, base.BorderThickness.Left);
switch (this.BorderStyle)
{
case BorderStyle.Fixed3D:
Brush brush1 = color.CreateLinearTwoGradientsBrush(90.0, 80, -80);
Brush brush2 = color.CreateLinearTwoGradientsBrush(90.0, -80, 80);
drawingContext.DrawRectangle(brush1, null, new Rect(0, 0, width, height));
drawingContext.DrawRectangle(brush2, null, new Rect(bevel, bevel, width - 2 * bevel, height - 2 * bevel));
break;
case BorderStyle.FixedSingle:
drawingContext.DrawRectangle(this.Background, pen, new Rect(0, 0, width, height));
break;
default:
drawingContext.DrawRectangle(this.Background, pen, new Rect(0, 0, width, height));
break;
}
string txt = this.Text;
if (!string.IsNullOrEmpty(txt))
{
FormattedText formattedText = new FormattedText(txt, System.Globalization.CultureInfo.CurrentUICulture, FlowDirection.LeftToRight,
new Typeface(base.FontFamily, base.FontStyle, base.FontWeight, base.FontStretch), base.FontSize, base.Foreground);
Point pt = new Point((this.TextAlignment == TextAlignment.Center ? (width - formattedText.Width) * 0.5 :
this.TextAlignment == TextAlignment.Left ? bevel : width - bevel - formattedText.Width), (height - formattedText.Height) * 0.5);
drawingContext.DrawText(formattedText, pt);
}
}
[Category("HMI")]
public BorderStyle BorderStyle
{
get
{
return (BorderStyle)base.GetValue(BorderStyleProperty);
}
set
{
base.SetValue(BorderStyleProperty, value);
}
}
[Category("Text")]
public TextAlignment TextAlignment
{
get
{
return (TextAlignment)base.GetValue(TextAlignmentProperty);
}
set
{
base.SetValue(TextAlignmentProperty, value);
}
}
[Category("HMI")]
public string Text
{
get
{
return (string)base.GetValue(TextProperty);
}
set
{
base.SetValue(TextProperty, value);
}
}
[Category("HMI")]
public string StringFormat
{
get
{
return (string)base.GetValue(StringFormatProperty);
}
set
{
base.SetValue(StringFormatProperty, value);
}
}
public override Action SetTagReader(string key, Delegate tagChanged)
{
switch (key)
{
case TagActions.TEXT:
var _funcText = tagChanged as Func<string>;
if (_funcText != null)
{
return delegate { this.Text = _funcText(); };
}
else
{
var _funcFloat = tagChanged as Func<float>;
if (_funcFloat != null)
{
return delegate
{
var format = this.StringFormat;
this.Text = string.IsNullOrEmpty(format) ? _funcFloat().ToString() : _funcFloat().ToString(format);
};
}
else
{
var _funcint = tagChanged as Func<int>;
{
if (_funcint != null)
return delegate { this.Text = _funcint().ToString(); };
else
{
var _funcbool = tagChanged as Func<bool>;
if (_funcbool != null)
{
return delegate { this.Text = _funcbool() ? "1" : "0"; };
}
}
}
}
}
return null;
}
return base.SetTagReader(key, tagChanged);
}
[Category("Common")]
public string TagWriteText
{
get
{
return (string)base.GetValue(TagWriteTextProperty);
}
set
{
base.SetValue(TagWriteTextProperty, value);
}
}
[Category("HMI")]
public bool IsPulse
{
get
{
return (bool)base.GetValue(IsPulseProperty);
}
set
{
base.SetValue(IsPulseProperty, value);
}
}
protected List<Func<object, int>> _funcWrites = new List<Func<object, int>>();
public bool SetTagWriter(IEnumerable<Delegate> tagWriter)
{
bool ret = true;
_funcWrites.Clear();
foreach (var item in tagWriter)
{
Func<object, int> _funcWrite = item as Func<object, int>;
if (_funcWrite != null)
_funcWrites.Add(_funcWrite);
else
{
ret = false;
break;
}
}
return ret;
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Return && _funcWrites.Count>0 && !string.IsNullOrEmpty(Text))
{
foreach (var func in _funcWrites)
{
func(Text);
}
}
base.OnKeyDown(e);
}
}
public enum BorderStyle
{
Fixed3D,
FixedSingle,
None
}
}