private void AddLineToPage(LineSrcDst _lineIP) { //Vector vector = VisualTreeHelper.GetOffset(ipAndEllipses[srcIP]); Ellipse srcEllipse, dstEllipse; _lineIP.daSrcDstX = new DoubleAnimation(); _lineIP.daSrcDstY = new DoubleAnimation(); _lineIP.daDsSrctX = new DoubleAnimation(); _lineIP.daDsSrctY = new DoubleAnimation(); if (ipAndEllipses.ContainsKey(_lineIP._srcip)) { srcEllipse = ipAndEllipses[_lineIP._srcip]; } else { srcEllipse = null; } if (ipAndEllipses.ContainsKey(_lineIP._dstip)) { dstEllipse = ipAndEllipses[_lineIP._dstip]; } else { dstEllipse = null; } EllipseInfo srcEllipseInfo = (EllipseInfo)srcEllipse.Tag; EllipseInfo dstEllipseInfo = (EllipseInfo)dstEllipse.Tag; Duration duration = new Duration(new TimeSpan(0, 0, 1)); _lineIP.daSrcDstX.Duration = duration; _lineIP.daSrcDstY.Duration = duration; _lineIP.daDsSrctX.Duration = duration; _lineIP.daDsSrctY.Duration = duration; _lineIP.raSrcDst = new Rectangle(); _lineIP.raSrcDst.Fill = Brushes.Red; _lineIP.raSrcDst.Width = 6; _lineIP.raSrcDst.Height = 6; _lineIP.raSrcDst.RadiusX = 3; _lineIP.raSrcDst.RadiusY = 3; _lineIP.raDstSrc = new Rectangle(); _lineIP.raDstSrc.Fill = Brushes.Red; _lineIP.raDstSrc.Width = 6; _lineIP.raDstSrc.Height = 6; _lineIP.raDstSrc.RadiusX = 3; _lineIP.raDstSrc.RadiusY = 3; //EllipseInfo tempElinfoSrc = (EllipseInfo)ipAndEllipses[_lineIP._srcip].Tag; //EllipseInfo tempElinfoDst = (EllipseInfo)ipAndEllipses[_lineIP._dstip].Tag; //_lineIP.daSrcDstX.From = tempElinfoSrc.CenterPointX - 3; //_lineIP.daSrcDstY.From = tempElinfoSrc.CenterPointY - 3; //_lineIP.daSrcDstX.To = tempElinfoDst.CenterPointX - 3; //_lineIP.daSrcDstY.To = tempElinfoDst.CenterPointY - 3; //_lineIP.daDsSrctX.From = tempElinfoDst.CenterPointX - 3; //_lineIP.daDsSrctY.From = tempElinfoDst.CenterPointY - 3; //_lineIP.daDsSrctX.To = tempElinfoSrc.CenterPointX - 3; //_lineIP.daDsSrctY.To = tempElinfoSrc.CenterPointY - 3; Storyboard.SetTarget(_lineIP.daSrcDstX, _lineIP.raSrcDst); Storyboard.SetTarget(_lineIP.daSrcDstY, _lineIP.raSrcDst); Storyboard.SetTargetProperty(_lineIP.daSrcDstX, new PropertyPath("(Canvas.Left)")); Storyboard.SetTargetProperty(_lineIP.daSrcDstY, new PropertyPath("(Canvas.Top)")); Storyboard.SetTarget(_lineIP.daDsSrctX, _lineIP.raDstSrc); Storyboard.SetTarget(_lineIP.daDsSrctY, _lineIP.raDstSrc); Storyboard.SetTargetProperty(_lineIP.daDsSrctX, new PropertyPath("(Canvas.Left)")); Storyboard.SetTargetProperty(_lineIP.daDsSrctY, new PropertyPath("(Canvas.Top)")); animationRects.Add(_lineIP.raSrcDst); animationRects.Add(_lineIP.raDstSrc); _lineIP.raSrcDst.SetValue(Canvas.ZIndexProperty, 200); _lineIP.raSrcDst.Visibility = Visibility.Hidden; _lineIP.raSrcDst.IsHitTestVisible = false; _lineIP.raDstSrc.SetValue(Canvas.ZIndexProperty, 200); _lineIP.raDstSrc.Visibility = Visibility.Hidden; _lineIP.raDstSrc.IsHitTestVisible = false; canvas1.Children.Add(_lineIP.raSrcDst); canvas1.Children.Add(_lineIP.raDstSrc); Line l = new Line(); l.SnapsToDevicePixels = true; l.Stroke = new SolidColorBrush(Colors.Blue); l.StrokeThickness = 2; l.Tag = _lineIP; l.SetBinding(Line.X1Property, new Binding() { Path = new PropertyPath("CenterPointX"), Source = srcEllipseInfo }); l.SetBinding(Line.Y1Property, new Binding() { Path = new PropertyPath("CenterPointY"), Source = srcEllipseInfo }); l.SetBinding(Line.X2Property, new Binding() { Path = new PropertyPath("CenterPointX"), Source = dstEllipseInfo }); l.SetBinding(Line.Y2Property, new Binding() { Path = new PropertyPath("CenterPointY"), Source = dstEllipseInfo }); l.MouseEnter += new MouseEventHandler(l_MouseEnter); l.MouseLeave += new MouseEventHandler(l_MouseLeave); l.SetValue(ToolTipService.InitialShowDelayProperty, 0); l.SetValue(ToolTipService.ShowDurationProperty, 100000); canvas1.Children.Add(l); }
void timer_Tick(object sender, EventArgs e) { #region 每次计时器跳时把队列中的点和线画到屏幕上 List <LineSrcDst> tempListIP; List <LineSrcDst> tempDrawLine; lock (tempEllipseLineLock) { tempListIP = listIP; listIP = new List <LineSrcDst>(); tempDrawLine = drawLine; drawLine = new List <LineSrcDst>(); } foreach (var ip in tempListIP) { AddEllipseToPage(ip._srcip, ip._dstip); } foreach (var lineIP in tempDrawLine) { AddLineToPage(lineIP); } #endregion storyBoard.Children.Clear(); //每次跳时根据控件的类型来更新点线的参数,大小,宽度等 foreach (var element in canvas1.Children) { if (element is Ellipse) { tempEllipseInfo = (EllipseInfo)((Ellipse)element).Tag; pointSize = PointSize(ipAndPeerInfos[tempEllipseInfo.ip].allSendPkNum); ipAndEllipses[tempEllipseInfo.ip].Height = pointSize; ipAndEllipses[tempEllipseInfo.ip].Width = pointSize; tempEllipseInfo.TextBlockLeft = tempEllipseInfo.left; tempEllipseInfo.TextBlockTop = tempEllipseInfo.top; //下面两行随便赋值,只是为了激活line端点坐标的重新绑定 // tempEllipseInfo.CenterPointX = 100; // tempEllipseInfo.CenterPointY = 100; tempEllipseInfo.RaiseNotifyPropertyChanged("CenterPointX"); tempEllipseInfo.RaiseNotifyPropertyChanged("CenterPointY"); } if (element is Line) { int allPKNumInLineSrcToDst = 0; int allPKNumInLineDstToSrc = 0; tempLine = (Line)element; tempLineSrcDst = (LineSrcDst)tempLine.Tag; if (ipAndPeerInfos[tempLineSrcDst._srcip].peerToPeers.ContainsKey(tempLineSrcDst._dstip)) { allPKNumInLineSrcToDst = ipAndPeerInfos[tempLineSrcDst._srcip].peerToPeers[tempLineSrcDst._dstip].totalSendPkNum; } if (ipAndPeerInfos[tempLineSrcDst._dstip].peerToPeers.ContainsKey(tempLineSrcDst._srcip)) { allPKNumInLineDstToSrc = ipAndPeerInfos[tempLineSrcDst._dstip].peerToPeers[tempLineSrcDst._srcip].totalSendPkNum; } tempLine.StrokeThickness = LineThickness(allPKNumInLineSrcToDst + allPKNumInLineDstToSrc); if ((bool)cbShowAnimation.IsChecked) { srcEllipseInfo = (EllipseInfo)ipAndEllipses[tempLineSrcDst._srcip].Tag; dstEllipseInfo = (EllipseInfo)ipAndEllipses[tempLineSrcDst._dstip].Tag; if (allPKNumInLineSrcToDst > tempLineSrcDst.oldAllPKNumInLineSrcToDst) { tempLineSrcDst.raSrcDst.Visibility = Visibility.Visible; tempLineSrcDst.daSrcDstX.From = srcEllipseInfo.CenterPointX - 3; tempLineSrcDst.daSrcDstY.From = srcEllipseInfo.CenterPointY - 3; tempLineSrcDst.daSrcDstX.To = dstEllipseInfo.CenterPointX - 3; tempLineSrcDst.daSrcDstY.To = dstEllipseInfo.CenterPointY - 3; //Storyboard.SetTarget(tempLineSrcDst.daSrcDstX, tempLineSrcDst.raSrcDst); //Storyboard.SetTarget(tempLineSrcDst.daSrcDstY, tempLineSrcDst.raSrcDst); //Storyboard.SetTargetProperty(tempLineSrcDst.daSrcDstX, new PropertyPath("(Canvas.Left)")); //Storyboard.SetTargetProperty(tempLineSrcDst.daSrcDstY, new PropertyPath("(Canvas.Top)")); storyBoard.Children.Add(tempLineSrcDst.daSrcDstX); storyBoard.Children.Add(tempLineSrcDst.daSrcDstY); } if (allPKNumInLineDstToSrc > tempLineSrcDst.oldAllPKNumInLineDstToSrc) { tempLineSrcDst.raDstSrc.Visibility = Visibility.Visible; tempLineSrcDst.daDsSrctX.From = dstEllipseInfo.CenterPointX - 3; tempLineSrcDst.daDsSrctY.From = dstEllipseInfo.CenterPointY - 3; tempLineSrcDst.daDsSrctX.To = srcEllipseInfo.CenterPointX - 3; tempLineSrcDst.daDsSrctY.To = srcEllipseInfo.CenterPointY - 3; //Storyboard.SetTarget(tempLineSrcDst.daDsSrctX, tempLineSrcDst.raDstSrc); //Storyboard.SetTarget(tempLineSrcDst.daDsSrctY, tempLineSrcDst.raDstSrc); //Storyboard.SetTargetProperty(tempLineSrcDst.daDsSrctX, new PropertyPath("(Canvas.Left)")); //Storyboard.SetTargetProperty(tempLineSrcDst.daDsSrctY, new PropertyPath("(Canvas.Top)")); storyBoard.Children.Add(tempLineSrcDst.daDsSrctX); storyBoard.Children.Add(tempLineSrcDst.daDsSrctY); } } tempLineSrcDst.oldAllPKNumInLineSrcToDst = allPKNumInLineSrcToDst; tempLineSrcDst.oldAllPKNumInLineDstToSrc = allPKNumInLineDstToSrc; } } storyBoard.Begin(); }