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.
118 lines
4.2 KiB
118 lines
4.2 KiB
using System.ComponentModel;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Documents;
|
|
|
|
namespace HMIControl
|
|
{
|
|
public abstract class LinkableControl : Control
|
|
{
|
|
#region 用于定义被连接端口的依赖属性
|
|
public static readonly DependencyProperty LeftPinProperty =
|
|
DependencyProperty.Register("LeftPin", typeof(ConnectInfo), typeof(LinkableControl),
|
|
new FrameworkPropertyMetadata(ConnectInfo.Empty));
|
|
public ConnectInfo LeftPin
|
|
{
|
|
get { return (ConnectInfo)base.GetValue(LeftPinProperty); }
|
|
set { base.SetValue(LeftPinProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty RightPinProperty =
|
|
DependencyProperty.Register("RightPin", typeof(ConnectInfo), typeof(LinkableControl),
|
|
new FrameworkPropertyMetadata(ConnectInfo.Empty));
|
|
public ConnectInfo RightPin
|
|
{
|
|
get { return (ConnectInfo)base.GetValue(RightPinProperty); }
|
|
set { base.SetValue(RightPinProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty TopPinProperty =
|
|
DependencyProperty.Register("TopPin", typeof(ConnectInfo), typeof(LinkableControl),
|
|
new FrameworkPropertyMetadata(ConnectInfo.Empty));
|
|
public ConnectInfo TopPin
|
|
{
|
|
get { return (ConnectInfo)base.GetValue(TopPinProperty); }
|
|
set { base.SetValue(TopPinProperty, value); }
|
|
}
|
|
|
|
public static readonly DependencyProperty BottomPinProperty =
|
|
DependencyProperty.Register("BottomPin", typeof(ConnectInfo), typeof(LinkableControl),
|
|
new FrameworkPropertyMetadata(ConnectInfo.Empty));
|
|
public ConnectInfo BottomPin
|
|
{
|
|
get { return (ConnectInfo)base.GetValue(BottomPinProperty); }
|
|
set { base.SetValue(BottomPinProperty, value); }
|
|
}
|
|
|
|
#endregion
|
|
|
|
public ControlAdorner LinkableAdorner{ get; set; }//在OnRenderSizeChanged函数中创建
|
|
|
|
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
|
|
{
|
|
base.OnRenderSizeChanged(sizeInfo);
|
|
if (DesignerProperties.GetIsInDesignMode(this))
|
|
{
|
|
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);
|
|
if (adornerLayer != null)
|
|
{
|
|
if (LinkableAdorner == null)
|
|
{
|
|
LinkableAdorner = new ControlAdorner(this);
|
|
LinkableAdorner.Visibility = Visibility.Hidden;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static readonly DependencyProperty IsLinkDragOverProperty =
|
|
DependencyProperty.Register("IsLinkDragOver", typeof(bool), typeof(LinkableControl),
|
|
new FrameworkPropertyMetadata(false, IsLinkDragOverPropertyChanged));
|
|
|
|
static void IsLinkDragOverPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
LinkableControl lc = o as LinkableControl;
|
|
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(lc);
|
|
if (lc.LinkableAdorner != null && adornerLayer != null)
|
|
{
|
|
if (e.NewValue.Equals(true))
|
|
{
|
|
lc.LinkableAdorner.Visibility = Visibility.Visible;
|
|
adornerLayer.Add(lc.LinkableAdorner);
|
|
}
|
|
else
|
|
{
|
|
lc.LinkableAdorner.Visibility = Visibility.Hidden;
|
|
adornerLayer.Remove(lc.LinkableAdorner);
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool IsLinkDragOver
|
|
{
|
|
get
|
|
{
|
|
return (bool)GetValue(IsLinkDragOverProperty);
|
|
}
|
|
set
|
|
{
|
|
SetValue(IsLinkDragOverProperty, value);
|
|
}
|
|
}
|
|
|
|
public abstract LinkPosition[] GetLinkPositions();
|
|
}
|
|
|
|
public struct LinkPosition
|
|
{
|
|
public Point Position;
|
|
public ConnectOrientation Orient;
|
|
|
|
public LinkPosition(Point p, ConnectOrientation o)
|
|
{
|
|
this.Position = p;
|
|
this.Orient = o;
|
|
}
|
|
}
|
|
|
|
}
|
|
|