sliverlight工作流(3)

Get Microsoft
Silverlight

ps: 1.解决连线问题

     2.但是觉得架构没做好(望高手指点)

     3. 后面处理直线变成折线(及绕过障碍)

基础类:

 

baseActive

    
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()
        {
          
        }
    }

 

 

管理线的基础类:

 

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

 

划线笔(可加载任何 UI元素)

 

StartLine
 public class StartLine : baseActive
    {

        
//创建的孩子element
        private StartLine Chilren = null;
        
//委托 用于调用方法 生成 element
        TempleElement Tetemple;
        baseline Line 
= new baseline(new Point(00), new Point(00));
        
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: 在移动的过程中 更新 线的坐标

 

 

templateActive
 //定义委托
    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());
        }
    }

 

 使用:

 

MainPage

        
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: 望各位高手 指点...

 

 

 

 

posted @ 2010-04-05 22:21  3.mu  阅读(921)  评论(0编辑  收藏  举报