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;
            };
        }
    }

注意:基类继承自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 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);

        }

 后面 我将处理 拖动活动 与活动之间不能重叠的问题 就像 游戏中的 构建障碍物

      

  

posted @ 2010-04-03 10:53  3.mu  阅读(479)  评论(1)    收藏  举报