if (currentStockInfo.Count() == 0)
return;
if (isCanvasClear)
{
canvas.Children.Add(LineX);
canvas.Children.Add(LineY);
isCanvasClear = false;
}
if (point1.X < leftOffset || point1.X > canvas.ActualWidth)
return;
LineX.X1 = 0;
LineX.X2 = canvas.ActualWidth;
LineX.Y1 = point1.Y;
LineX.Y2 = point1.Y;
LineX.SnapsToDevicePixels = true;
LineY.X1 = point1.X;
LineY.X2 = point1.X;
LineY.Y1 = 0;
LineY.Y2 = this.Height;
LineY.SnapsToDevicePixels = true;
当canvas里面的图形比较多的时候,鼠标移动划线会越来越卡,鼠标倒是不卡,就是划线延时厉害
、demo地址https://files.cnblogs.com/files/tianmochou/DrawTest.rar
发个demo吧
https://files.cnblogs.com/files/tianmochou/DrawTest.rar demo地址可以看看,这个问题弄了近两天还没解决,
@beaful: 为什么会加那么多rect?
@会长: 这个只是模拟问题,实际中会在canvas绘制好多图形,当图形达到一定量的时候,十字线就会很卡
@会长: 关键是这个量并不多,5000以前就会明显延时情况
@beaful: 哦
@beaful: 哦。我试了下用两个canvas,一个绘制rect,另一个透明的绘制横线和竖线,效果有改善,但是还是有些卡。能不能绘制在一张图片上,然后把图片当做背景
@会长: 两个canvas这个我也试过,两个canvas叠加在一起,在上层那个设置透明,试过几次没发现效果太大改变,感觉问题像是mousemove的时候,canvas会默认执行很多操作。
如果两个canvas不叠加,mouse在那个内容少的canvas上面移动,然后还在线条多的canvas上面画十字线基本不会这么卡
@beaful: 我说的另一个办法可以吗,把rect绘制到一张图片上
@会长:内容做成背景图片确实可以解决这个问题,但是就不能交互了吧
比如鼠标移到某个线上,弹出相应值什么的
@beaful: 只要保证图片和canvas的大小一样,这样他们的坐标就是一样的,窗体大小改变了重绘图片
https://bbs.csdn.net/topics/392194253
这里面有这个问题详细讨轮
@会长: 如果保存为图片背景了,比如画了一条线,很难知道鼠标是否移到这条线上了吧
@会长: 使用wpf现有控件主要是向交互方便些
现在考虑是用DrawingVisual试试看效果,但是听说DrawingVisual 的Hit Testing不是很准
@会长: 难道最初选wpf绘图就是错误了,这让人纠结
@beaful:可以吧,知道知道那条线的坐标就可以计算出来
@beaful: 我试了下加了个图片,速度简直飞起来,就是不到你能解决你说的“交互”问题吗,如果用图片的话
@会长:
很难吧,
@会长: 这个是折线,横坐标纵坐标都要记住,但是两个坐标点那一块就不知道了
@会长: 两个坐标点之间的那一段线段,不知道鼠标是否在上面
@beaful: 不太明白你说的。等我有空再看看。不好意思,我没时间再研究了。另外你看看楼上发的那个连接,好像可以用。
也可以试试Popup,看能画十字吗
@会长: 嗯嗯
@beaful: 我不太明白你说的,我是觉得,只要你能保证图片大大小和canvas重叠,那canvas上的坐标就和图片上的坐标完全一致。那些线啊,方块把把他们的坐标,大小放到内存里。获取当前鼠标的位置就可以计算鼠标距离某个线某个矩形的距离,理论上。
@会长:
两个点可以坐标可以存内存,但是两个点之间那段线就存不了了
@beaful: 两个点就够了,两个点确定一条直线,判断一个点是否在直线上初中就学过了。另外也可以把线段的每个点放了数组里。
@会长: 还是研究研究DrawingVisuals吧,实现起来逻辑太复杂了
@会长: 谢谢,这么耐心的回答
@beaful: 假设线段的端点是\((x_1,y_1)\)和\((x_2,y_2)\),现在求\((x, y)\)在不在直线上,只要判断\(\frac{x_1-x_2}{y_1-y_2}\)是否等于\(\frac{x-x_1}{y-y_1}\),因为除法可能精度有问题,约等于就好了,误差小于某个值,就认为\((x,y)\)在直线上,再加一个条件判断是不是在线性中间而不是延长线上:横坐标大于左侧端点的横坐标且小于右端点的横坐标
@beaful: 你最后怎么解决了?
@会长: 解决了,用了比较轻型绘图方法
@beaful: 使用了缓冲技术,划十字线的时候
@beaful: 赞