sliverlight工作流设计(1)
ps:1.最近闲来没有事情干,练练手:Silverlight工作流设计器。
2.初学sliverlight
3.在这次主要目的 是创建可拖动的 Active基类
首先创建 active基础类
active
public class baseActive : Canvas
{
//保存节点
protected Point movePoint;
//是否可以移动
protected bool IsMove = false;
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 baseActive()
{
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.MouseMove += (sender, e) =>
{
if (IsMove&&!isbase)
{
FrameworkElement element = sender as FrameworkElement;
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);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(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;
};
}
}
{
//保存节点
protected Point movePoint;
//是否可以移动
protected bool IsMove = false;
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 baseActive()
{
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.MouseMove += (sender, e) =>
{
if (IsMove&&!isbase)
{
FrameworkElement element = sender as FrameworkElement;
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);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(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
创建一个模板类 可以加载任意的 element 作为模板active 并可以从使该模板拖动出element
模板active
//定义委托
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) =>
{
templateActive element = sender as templateActive;
if (IsMove&&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;
}
//可以拖动 并不是模板
if (IsMove && !Isbase)
{
Canvas.SetZIndex(element, 1000);
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);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
}
};
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) =>
{
templateActive element = sender as templateActive;
if (IsMove&&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;
}
//可以拖动 并不是模板
if (IsMove && !Isbase)
{
Canvas.SetZIndex(element, 1000);
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);
element.SetValue(Canvas.TopProperty, NowTop);
element.SetValue(Canvas.LeftProperty, NowLeft);
movePoint = e.GetPosition(element);
}
};
this.Children.Add(temp());
}
}
准备工作完成后 实际调用:
使用
public MainPage()
{
InitializeComponent();
Initialize();
}
/// <summary>
/// 添加活动模板
/// </summary>
protected void Initialize()
{
templateActive demo = new templateActive(() =>
{
Rectangle rect = new Rectangle();
rect.Width = 80;
rect.Height = 40;
rect.RadiusX = 10;
rect.RadiusY = 10;
rect.Fill = new SolidColorBrush(Colors.Green);
rect.Opacity = Opacity;
return rect;
});
demo.Canvas_Left = 100;
demo.Canvas_Top = 100;
templateActive demo2 = new templateActive(() =>
{
Rectangle rect = new Rectangle();
rect.Width = 80;
rect.Height = 40;
rect.RadiusX = 10;
rect.RadiusY = 10;
rect.Fill = new SolidColorBrush(Colors.Black);
return rect;
});
demo2.Canvas_Left = 100;
demo2.Canvas_Top = 200;
templateActive demo3 = new templateActive(() =>
{ //加载UserControl
return new Approve();
});
demo3.Canvas_Left = 100;
demo3.Canvas_Top = 300;
MainZone.Children.Add(demo);
MainZone.Children.Add(demo2);
MainZone.Children.Add(demo3);
}
{
InitializeComponent();
Initialize();
}
/// <summary>
/// 添加活动模板
/// </summary>
protected void Initialize()
{
templateActive demo = new templateActive(() =>
{
Rectangle rect = new Rectangle();
rect.Width = 80;
rect.Height = 40;
rect.RadiusX = 10;
rect.RadiusY = 10;
rect.Fill = new SolidColorBrush(Colors.Green);
rect.Opacity = Opacity;
return rect;
});
demo.Canvas_Left = 100;
demo.Canvas_Top = 100;
templateActive demo2 = new templateActive(() =>
{
Rectangle rect = new Rectangle();
rect.Width = 80;
rect.Height = 40;
rect.RadiusX = 10;
rect.RadiusY = 10;
rect.Fill = new SolidColorBrush(Colors.Black);
return rect;
});
demo2.Canvas_Left = 100;
demo2.Canvas_Top = 200;
templateActive demo3 = new templateActive(() =>
{ //加载UserControl
return new Approve();
});
demo3.Canvas_Left = 100;
demo3.Canvas_Top = 300;
MainZone.Children.Add(demo);
MainZone.Children.Add(demo2);
MainZone.Children.Add(demo3);
}
后面 我将处理 拖动活动 与活动之间不能重叠的问题 就像 游戏中的 构建障碍物


浙公网安备 33010602011771号