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.

213 lines
7.5 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
namespace HMIControl
{
public class HMIControlBase : LinkableControl, ITagReader
{
public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(HMIControlBase));
public static readonly DependencyProperty DeviceNameProperty = DependencyProperty.Register("DeviceName", typeof(string), typeof(HMIControlBase));
public static readonly DependencyProperty ShowCaptionProperty =
DependencyProperty.Register("ShowCaption", typeof(bool), typeof(HMIControlBase), new FrameworkPropertyMetadata(true));
public static readonly DependencyProperty AlarmProperty =
DependencyProperty.Register("Alarm", typeof(bool), typeof(HMIControlBase),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged)));
protected static void OnValueChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
HMIControlBase control = obj as HMIControlBase;
if (control != null)
control.UpdateState();
}
protected virtual void UpdateState() { }
[Category("HMI")]
public string Caption
{
get
{ return (string)GetValue(CaptionProperty); }
set
{ SetValue(CaptionProperty, value); }
}
[Category("HMI")]
public string DeviceName
{
get
{ return (string)GetValue(DeviceNameProperty); }
set
{ SetValue(DeviceNameProperty, value); }
}
[Category("HMI")]
public bool ShowCaption
{
get
{ return (bool)GetValue(ShowCaptionProperty); }
set
{ SetValue(ShowCaptionProperty, value); }
}
[Category("HMI")]
public bool Alarm
{
get
{ return (bool)GetValue(AlarmProperty); }
set
{ SetValue(AlarmProperty, value); }
}
public HMIControlBase()
: base()
{
LayoutUpdated += new EventHandler(HMIControlBase_LayoutUpdated);
//this.CommandBindings.AddRange(BindingCommandHandler());
}
void HMIControlBase_LayoutUpdated(object sender, EventArgs e)
{
if (!DesignerProperties.GetIsInDesignMode(this)) LayoutUpdated -= HMIControlBase_LayoutUpdated;
var list = GetLinkPositions();
if (list.Length == 0) return;
var pt = TranslatePoint(new Point(), Parent as UIElement);
double x = pt.X;
double y = pt.Y;
if (double.IsNaN(x) || double.IsNaN(y)) return;
MatrixTransform matrixTran = RenderTransform as MatrixTransform;//此处也应考虑矩阵变换后的情况。
var matrix = matrixTran == null ? Matrix.Identity : matrixTran.Matrix;
double w = ActualWidth;
double h = ActualHeight;
ConnectInfo info = ConnectInfo.Empty;
info.DesignerRect = new Rect(x, y, w, h);
foreach (var lp in list)
{
Point point = matrixTran == null ? lp.Position : matrix.Transform(lp.Position);
info.Position = new Point(w * point.X + x, h * point.Y + y);
switch (lp.Orient)
{
case ConnectOrientation.Left:
info.Orient = matrix.M11 < 0 ? ConnectOrientation.Right : ConnectOrientation.Left;
LeftPin = info;
break;
case ConnectOrientation.Right:
info.Orient = matrix.M11 < 0 ? ConnectOrientation.Left : ConnectOrientation.Right;
RightPin = info;
break;
case ConnectOrientation.Top:
info.Orient = matrix.M22 < 0 ? ConnectOrientation.Bottom : ConnectOrientation.Top;
TopPin = info;
break;
case ConnectOrientation.Bottom:
info.Orient = matrix.M22 < 0 ? ConnectOrientation.Top : ConnectOrientation.Bottom;
BottomPin = info;
break;
}
}
}
protected override void OnMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseRightButtonDown(e);
this.Focus();
}
public override LinkPosition[] GetLinkPositions()
{
return new LinkPosition[0];
}
protected IList<ITagLink> children;
public IList<ITagLink> Children
{
get { return children; }
}
public ConnectInfo GetInfo1(ConnectOrientation orient, Point p)
{
ConnectInfo info = ConnectInfo.Empty;
double w = this.ActualWidth;
double h = this.ActualHeight;
info.Position = new Point((w - 10) * p.X + 5, (h - 10) * p.Y + 5);
info.DesignerRect = new Rect(0, 0, w, h);
info.Orient = orient;
return info;
}
#region ITagReader接口实现
public static readonly DependencyProperty TagReadTextProperty =
DependencyProperty.Register("TagReadText", typeof(string), typeof(HMIControlBase));
[Category("HMI")]
public string TagReadText
{
get { return ((string)base.GetValue(TagReadTextProperty)); }
set { base.SetValue(TagReadTextProperty, value); }
}
public virtual string[] GetActions()
{
return new string[] { TagActions.VISIBLE, TagActions.CAPTION, TagActions.DEVICENAME, TagActions.ALARM };
}
public virtual Action SetTagReader(string key, Delegate tagChanged)
{
switch (key)
{
case TagActions.DEVICENAME:
var _funcname = tagChanged as Func<string>;
if (_funcname != null)
{
return delegate
{
this.DeviceName = _funcname();
};
}
else return null;
case TagActions.VISIBLE:
var _funcVisible = tagChanged as Func<bool>;
if (_funcVisible != null)
{
return delegate
{
this.Visibility = _funcVisible() ? Visibility.Visible : Visibility.Hidden;
};
}
else return null;
case TagActions.CAPTION:
var _funcCaption = tagChanged as Func<string>;
if (_funcCaption != null)
{
return delegate { this.Caption = _funcCaption(); };
}
else return null;
case TagActions.ALARM:
var _funcAlarm = tagChanged as Func<bool>;
if (_funcAlarm != null)
{
return delegate { this.Alarm = _funcAlarm(); };
}
return null;
}
return null;
}
public string Node
{
get { return this.Name; }
}
#endregion
}
}