sliverlight工作流(3)
ps: 1.解决连线问题
2.但是觉得架构没做好(望高手指点)
3. 后面处理直线变成折线(及绕过障碍)
基础类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class baseActive : Canvas
{
//保存节点
protected Point movePoint;
//是否可以移动
protected bool IsMove = false;
private List<baseline> toplines = new List<baseline>();
private List<baseline> endLines = new List<baseline>();
public double Canvas_Top
{
get { return Canvas.GetTop(this); }
set { Canvas.SetTop(this, value); }
}
public double Canvas_Left
{
get { return Canvas.GetLeft(this); }
set { Canvas.SetLeft(this, value); }
}
//是否是模板
private bool isbase = true;
public bool Isbase
{
get { return isbase; }
set { isbase = value; }
}
//起点在该元素上的 线的激活
public List<baseline> topLine
{
get { return toplines; }
}
//终点在该元素上的 线的激活
public List<baseline> endLine
{
get { return endLines; }
}
//添加线
public void addTopline(baseline line)
{
toplines.Add(line);
}
//添加线
public void addEndline(baseline line)
{
endLines.Add(line);
}
public baseActive()
{
}
}
管理线的基础类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class baseline : baseActive
{
private Line line = new Line();
public Point startPoint
{
get
{
Point start = new Point();
start.X = Canvas.GetLeft(this);
start.Y = Canvas.GetTop(this);
return start;
}
set
{
line.X1 = 0;
Canvas.SetLeft(this, value.X);
line.Y1 = 0;
Canvas.SetTop(this, value.Y);
}
}
public Point endPoint
{
get
{
Point end = new Point();
end.X = line.X2 + Canvas.GetLeft(this);
end.Y = line.Y2 + Canvas.GetTop(this);
return end;
}
set
{
line.X2 = value.X - Canvas.GetLeft(this);
line.Y2 = value.Y - Canvas.GetTop(this);
}
}
//起点元素
private FrameworkElement start_e;
//重点元素
private FrameworkElement end_e;
//主要是 在活动移动的过程中 更新线的端点用到
public FrameworkElement startElement
{
get { return start_e; }
set
{
baseActive underElement = value as baseActive;
Point p = new Point();
p.X = underElement.Canvas_Left + 40;
p.Y = underElement.Canvas_Top + 20;
//涉及到 一个算法 其实当起点原始位置改变的时候 线的实际startpoint 没变 应该修改 实际endpoint
if (end_e != null)
{
//计算改变量
double left = startPoint.X - p.X;
double top = startPoint.Y - p.Y;
//更新终点
endPoint = new Point(endPoint.X + left, endPoint.Y + top);
}
//实际是更新 线这个 活动的 Canvas.Left, Top
startPoint = p;
start_e = value;
}
}
//主要是 在活动移动的过程中 更新线的端点用到
public FrameworkElement endElement
{
get { return end_e; }
set
{ //更新终点
end_e = value;
baseActive underElement = value as baseActive;
Point p = new Point();
p.X = underElement.Canvas_Left + 40;
p.Y = underElement.Canvas_Top + 20;
endPoint = p;
}
}
public baseline(Point start, Point end)
{
startPoint = start;
endPoint = end;
line.Stroke = new SolidColorBrush(Colors.Green);
line.StrokeEndLineCap = PenLineCap.Triangle;
line.StrokeThickness = 1;
Isbase = true;
this.Children.Add(line);
line.Cursor = Cursors.Hand;
line.KeyDown += (o, e) =>
{
if (e.Key == Key.Delete)
{
if (MessageBox.Show("是否确认删除", "请确认", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
Canvas can = this.Parent as Canvas;
can.Children.Remove(this);
}
}
};
line.MouseEnter += (o, e) =>
{
line.Stroke = new SolidColorBrush(Colors.Red);
line.StrokeThickness = 3;
};
line.MouseLeave += (o, e) =>
{
line.Stroke = new SolidColorBrush(Colors.Green);
line.StrokeEndLineCap = PenLineCap.Triangle;
line.StrokeThickness = 1;
};
}
}
{
private Line line = new Line();
public Point startPoint
{
get
{
Point start = new Point();
start.X = Canvas.GetLeft(this);
start.Y = Canvas.GetTop(this);
return start;
}
set
{
line.X1 = 0;
Canvas.SetLeft(this, value.X);
line.Y1 = 0;
Canvas.SetTop(this, value.Y);
}
}
public Point endPoint
{
get
{
Point end = new Point();
end.X = line.X2 + Canvas.GetLeft(this);
end.Y = line.Y2 + Canvas.GetTop(this);
return end;
}
set
{
line.X2 = value.X - Canvas.GetLeft(this);
line.Y2 = value.Y - Canvas.GetTop(this);
}
}
//起点元素
private FrameworkElement start_e;
//重点元素
private FrameworkElement end_e;
//主要是 在活动移动的过程中 更新线的端点用到
public FrameworkElement startElement
{
get { return start_e; }
set
{
baseActive underElement = value as baseActive;
Point p = new Point();
p.X = underElement.Canvas_Left + 40;
p.Y = underElement.Canvas_Top + 20;
//涉及到 一个算法 其实当起点原始位置改变的时候 线的实际startpoint 没变 应该修改 实际endpoint
if (end_e != null)
{
//计算改变量
double left = startPoint.X - p.X;
double top = startPoint.Y - p.Y;
//更新终点
endPoint = new Point(endPoint.X + left, endPoint.Y + top);
}
//实际是更新 线这个 活动的 Canvas.Left, Top
startPoint = p;
start_e = value;
}
}
//主要是 在活动移动的过程中 更新线的端点用到
public FrameworkElement endElement
{
get { return end_e; }
set
{ //更新终点
end_e = value;
baseActive underElement = value as baseActive;
Point p = new Point();
p.X = underElement.Canvas_Left + 40;
p.Y = underElement.Canvas_Top + 20;
endPoint = p;
}
}
public baseline(Point start, Point end)
{
startPoint = start;
endPoint = end;
line.Stroke = new SolidColorBrush(Colors.Green);
line.StrokeEndLineCap = PenLineCap.Triangle;
line.StrokeThickness = 1;
Isbase = true;
this.Children.Add(line);
line.Cursor = Cursors.Hand;
line.KeyDown += (o, e) =>
{
if (e.Key == Key.Delete)
{
if (MessageBox.Show("是否确认删除", "请确认", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
Canvas can = this.Parent as Canvas;
can.Children.Remove(this);
}
}
};
line.MouseEnter += (o, e) =>
{
line.Stroke = new SolidColorBrush(Colors.Red);
line.StrokeThickness = 3;
};
line.MouseLeave += (o, e) =>
{
line.Stroke = new SolidColorBrush(Colors.Green);
line.StrokeEndLineCap = PenLineCap.Triangle;
line.StrokeThickness = 1;
};
}
}
划线笔(可加载任何 UI元素)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class StartLine : baseActive
{
//创建的孩子element
private StartLine Chilren = null;
//委托 用于调用方法 生成 element
TempleElement Tetemple;
baseline Line = new baseline(new Point(0, 0), new Point(0, 0));
public StartLine(TempleElement temp)
{ //保存委托 及方法引用地址(个人理解:委托有点像 C++里面的指针)
Tetemple = temp;
this.MouseMove += (sender, e) =>
{
if (IsMove)
{
StartLine element = sender as StartLine;
Canvas parent = element.Parent as Canvas;
if (element.Isbase)
{
//生成element
Chilren = new StartLine(Tetemple);
//并且新 element 为模板
Chilren.Isbase = true;
//指定新element的位置为原来element 地址
Chilren.Canvas_Left = Canvas_Left;
Chilren.Canvas_Top = Canvas_Top;
Chilren.Opacity = 1;
Canvas.SetZIndex(Chilren, 0);
//添加到Canvas
parent.Children.Add(Chilren);
//改变原 element不为模板,保证一次拖动产生一个element
element.Isbase = false;
element.Opacity = 0.5;
}
if (!Isbase)
{
double newtop = e.GetPosition(element).Y - movePoint.Y;
double newleft = e.GetPosition(element).X - movePoint.X;
double NowTop = newtop + (double)element.GetValue(Canvas.TopProperty);
double NowLeft = newleft + (double)element.GetValue(Canvas.LeftProperty);
Canvas.SetZIndex(element, 100000);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
Obsacles ob = Obsacles.Instance;
Point p = new Point(NowLeft, NowTop);
//获取鼠标 坐标处 的活动实例
baseActive underElement = ob.GetElementByPiont(p) as baseActive;
if (underElement != null)
{
//设置为起点
if (Line.startElement == null)
{
Line.startElement = underElement;
underElement.addTopline(Line);
parent.Children.Add(Line);
underElement = null;
}
}
if (Line.startElement != null)
{
Line.endPoint = p;
//终点
if (underElement != null)
{
Line.endElement = underElement;
if (Line.startElement != Line.endElement)
{
underElement.addEndline(Line);
parent.Children.Remove(element);
}
}
}
}
}
};
this.MouseLeftButtonUp += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
IsMove = false;
element.ReleaseMouseCapture();
element.Cursor = null;
element.Opacity = 1.0;
movePoint.X = movePoint.Y = 0;
Canvas parent = element.Parent as Canvas;
//删除线
if (Line.endElement == null || Line.startElement == Line.endElement)
{
parent.Children.Remove(Line);
}
if (!Isbase)
{
//删除画笔
parent.Children.Remove(element);
}
};
this.MouseLeftButtonDown += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
movePoint = e.GetPosition(element);
element.CaptureMouse();
element.Cursor = Cursors.Hand;
IsMove = true;
}
};
this.Children.Add(temp());
}
}
{
//创建的孩子element
private StartLine Chilren = null;
//委托 用于调用方法 生成 element
TempleElement Tetemple;
baseline Line = new baseline(new Point(0, 0), new Point(0, 0));
public StartLine(TempleElement temp)
{ //保存委托 及方法引用地址(个人理解:委托有点像 C++里面的指针)
Tetemple = temp;
this.MouseMove += (sender, e) =>
{
if (IsMove)
{
StartLine element = sender as StartLine;
Canvas parent = element.Parent as Canvas;
if (element.Isbase)
{
//生成element
Chilren = new StartLine(Tetemple);
//并且新 element 为模板
Chilren.Isbase = true;
//指定新element的位置为原来element 地址
Chilren.Canvas_Left = Canvas_Left;
Chilren.Canvas_Top = Canvas_Top;
Chilren.Opacity = 1;
Canvas.SetZIndex(Chilren, 0);
//添加到Canvas
parent.Children.Add(Chilren);
//改变原 element不为模板,保证一次拖动产生一个element
element.Isbase = false;
element.Opacity = 0.5;
}
if (!Isbase)
{
double newtop = e.GetPosition(element).Y - movePoint.Y;
double newleft = e.GetPosition(element).X - movePoint.X;
double NowTop = newtop + (double)element.GetValue(Canvas.TopProperty);
double NowLeft = newleft + (double)element.GetValue(Canvas.LeftProperty);
Canvas.SetZIndex(element, 100000);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
Obsacles ob = Obsacles.Instance;
Point p = new Point(NowLeft, NowTop);
//获取鼠标 坐标处 的活动实例
baseActive underElement = ob.GetElementByPiont(p) as baseActive;
if (underElement != null)
{
//设置为起点
if (Line.startElement == null)
{
Line.startElement = underElement;
underElement.addTopline(Line);
parent.Children.Add(Line);
underElement = null;
}
}
if (Line.startElement != null)
{
Line.endPoint = p;
//终点
if (underElement != null)
{
Line.endElement = underElement;
if (Line.startElement != Line.endElement)
{
underElement.addEndline(Line);
parent.Children.Remove(element);
}
}
}
}
}
};
this.MouseLeftButtonUp += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
IsMove = false;
element.ReleaseMouseCapture();
element.Cursor = null;
element.Opacity = 1.0;
movePoint.X = movePoint.Y = 0;
Canvas parent = element.Parent as Canvas;
//删除线
if (Line.endElement == null || Line.startElement == Line.endElement)
{
parent.Children.Remove(Line);
}
if (!Isbase)
{
//删除画笔
parent.Children.Remove(element);
}
};
this.MouseLeftButtonDown += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
movePoint = e.GetPosition(element);
element.CaptureMouse();
element.Cursor = Cursors.Hand;
IsMove = true;
}
};
this.Children.Add(temp());
}
}
活动实例:
ps: 在移动的过程中 更新 线的坐标
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//定义委托
public delegate FrameworkElement TempleElement();
public class templateActive : baseActive
{ //创建的孩子element
private templateActive Chilren = null;
//委托 用于调用方法 生成 element
TempleElement Tetemple;
public templateActive(TempleElement temp)
{ //保存委托 及方法引用地址(个人理解:委托有点像 C++里面的指针)
Tetemple = temp;
this.MouseMove += (sender, e) =>
{
if (IsMove)
{
templateActive element = sender as templateActive;
Obsacles obs = Obsacles.Instance;
if (element.Isbase)
{
//生成element
Chilren = new templateActive(Tetemple);
//并且新 element 为模板
Chilren.Isbase = true;
//指定新element的位置为原来element 地址
Chilren.Canvas_Left = Canvas_Left;
Chilren.Canvas_Top = Canvas_Top;
Chilren.Opacity = 1;
Canvas parent = element.Parent as Canvas;
Canvas.SetZIndex(Chilren, 0);
//添加到Canvas
parent.Children.Add(Chilren);
//改变原 element不为模板,保证一次拖动产生一个element
element.Isbase = false;
element.Opacity = 0.5;
//添加障碍物
obs.AddElement(element);
}
//判断前方是否是障碍物,或者由于移动过快 穿过障碍物 回退
if (!Isbase)
{
double newtop = e.GetPosition(element).Y - movePoint.Y;
double newleft = e.GetPosition(element).X - movePoint.X;
double NowTop = newtop + (double)element.GetValue(Canvas.TopProperty);
double NowLeft = newleft + (double)element.GetValue(Canvas.LeftProperty);
bool isobs = obs.CheckIsObs(element, NowTop, NowLeft);
Canvas.SetZIndex(element, 1000);
if (!isobs)
{
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
//更新活动相关连线坐标
if (element.topLine != null)
{
foreach (baseline line in element.topLine)
{
line.startElement = element;
}
}
if (element.endLine != null)
{
foreach (baseline line in element.endLine)
{
line.endElement = element;
}
}
}
}
}
};
this.MouseLeftButtonUp += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
Obsacles obs = Obsacles.Instance;
obs.UpDateObs(element);
IsMove = false;
element.ReleaseMouseCapture();
element.Cursor = null;
element.Opacity = 1.0;
movePoint.X = movePoint.Y = 0;
};
this.MouseLeftButtonDown += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
movePoint = e.GetPosition(element);
element.CaptureMouse();
element.Cursor = Cursors.Hand;
IsMove = true;
}
};
this.Children.Add(temp());
}
}
public delegate FrameworkElement TempleElement();
public class templateActive : baseActive
{ //创建的孩子element
private templateActive Chilren = null;
//委托 用于调用方法 生成 element
TempleElement Tetemple;
public templateActive(TempleElement temp)
{ //保存委托 及方法引用地址(个人理解:委托有点像 C++里面的指针)
Tetemple = temp;
this.MouseMove += (sender, e) =>
{
if (IsMove)
{
templateActive element = sender as templateActive;
Obsacles obs = Obsacles.Instance;
if (element.Isbase)
{
//生成element
Chilren = new templateActive(Tetemple);
//并且新 element 为模板
Chilren.Isbase = true;
//指定新element的位置为原来element 地址
Chilren.Canvas_Left = Canvas_Left;
Chilren.Canvas_Top = Canvas_Top;
Chilren.Opacity = 1;
Canvas parent = element.Parent as Canvas;
Canvas.SetZIndex(Chilren, 0);
//添加到Canvas
parent.Children.Add(Chilren);
//改变原 element不为模板,保证一次拖动产生一个element
element.Isbase = false;
element.Opacity = 0.5;
//添加障碍物
obs.AddElement(element);
}
//判断前方是否是障碍物,或者由于移动过快 穿过障碍物 回退
if (!Isbase)
{
double newtop = e.GetPosition(element).Y - movePoint.Y;
double newleft = e.GetPosition(element).X - movePoint.X;
double NowTop = newtop + (double)element.GetValue(Canvas.TopProperty);
double NowLeft = newleft + (double)element.GetValue(Canvas.LeftProperty);
bool isobs = obs.CheckIsObs(element, NowTop, NowLeft);
Canvas.SetZIndex(element, 1000);
if (!isobs)
{
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
//更新活动相关连线坐标
if (element.topLine != null)
{
foreach (baseline line in element.topLine)
{
line.startElement = element;
}
}
if (element.endLine != null)
{
foreach (baseline line in element.endLine)
{
line.endElement = element;
}
}
}
}
}
};
this.MouseLeftButtonUp += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
Obsacles obs = Obsacles.Instance;
obs.UpDateObs(element);
IsMove = false;
element.ReleaseMouseCapture();
element.Cursor = null;
element.Opacity = 1.0;
movePoint.X = movePoint.Y = 0;
};
this.MouseLeftButtonDown += (sender, e) =>
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
movePoint = e.GetPosition(element);
element.CaptureMouse();
element.Cursor = Cursors.Hand;
IsMove = true;
}
};
this.Children.Add(temp());
}
}
使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public MainPage()
{
InitializeComponent();
Initialize();
}
/// <summary>
/// 添加活动模板
/// </summary>
protected void Initialize()
{
templateActive demo2 = new templateActive(() => {
Rectangle rt = new Rectangle();
rt.Width = 80;
rt.Height = 40;
rt.Fill = new SolidColorBrush(Colors.Red);
rt.RadiusX = 40;
rt.RadiusY = 20;
return rt;
});
demo2.Canvas_Left = 100;
demo2.Canvas_Top = 100;
templateActive demo3 = new templateActive(() =>
{
return new Approve();
});
demo3.Canvas_Left = 100;
demo3.Canvas_Top = 300;
StartLine line = new StartLine(() => {
return new activeUI.LineStart();
});
line.Canvas_Left = 100;
line.Canvas_Top = 200;
MainZone.Children.Add(line);
MainZone.Children.Add(demo2);
MainZone.Children.Add(demo3);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Obsacles ob = Obsacles.Instance;
List<FrameworkElement> lists = ob.getAllElement();
foreach (FrameworkElement element in lists)
{
templateActive ba = element as templateActive;
MessageBox.Show(ba.Canvas_Left.ToString() + "---" + ba.Canvas_Top.ToString());
templateActive bb = ob.GetElementByPiont(new Point(ba.Canvas_Left, ba.Canvas_Top)) as templateActive;
MessageBox.Show(bb.Canvas_Left.ToString() + "---" + bb.Canvas_Top.ToString());
}
}
ps: 望各位高手 指点...