首页新闻找找看学习计划

wpf canvas鼠标移动向里面划线很卡

0
悬赏园豆:10 [已解决问题] 解决于 2019-07-18 17:06

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

beautifulday的主页 beautifulday | 初学一级 | 园豆:190
提问于:2019-04-23 15:25
< >
分享
最佳答案
0

发个demo吧

收获园豆:10
会长 | 大侠五级 |园豆:6275 | 2019-04-23 15:30

https://files.cnblogs.com/files/tianmochou/DrawTest.rar demo地址可以看看,这个问题弄了近两天还没解决,

beautifulday | 园豆:190 (初学一级) | 2019-04-23 15:57

@beaful: 为什么会加那么多rect?

会长 | 园豆:6275 (大侠五级) | 2019-04-23 16:16

@会长: 这个只是模拟问题,实际中会在canvas绘制好多图形,当图形达到一定量的时候,十字线就会很卡

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:18

@会长: 关键是这个量并不多,5000以前就会明显延时情况

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:20

@beaful: 哦

会长 | 园豆:6275 (大侠五级) | 2019-04-23 16:21

@beaful: 哦。我试了下用两个canvas,一个绘制rect,另一个透明的绘制横线和竖线,效果有改善,但是还是有些卡。能不能绘制在一张图片上,然后把图片当做背景

会长 | 园豆:6275 (大侠五级) | 2019-04-23 16:33

@会长: 两个canvas这个我也试过,两个canvas叠加在一起,在上层那个设置透明,试过几次没发现效果太大改变,感觉问题像是mousemove的时候,canvas会默认执行很多操作。
如果两个canvas不叠加,mouse在那个内容少的canvas上面移动,然后还在线条多的canvas上面画十字线基本不会这么卡

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:39

@beaful: 我说的另一个办法可以吗,把rect绘制到一张图片上

会长 | 园豆:6275 (大侠五级) | 2019-04-23 16:42

@会长:内容做成背景图片确实可以解决这个问题,但是就不能交互了吧
比如鼠标移到某个线上,弹出相应值什么的

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:42

@beaful: 只要保证图片和canvas的大小一样,这样他们的坐标就是一样的,窗体大小改变了重绘图片

会长 | 园豆:6275 (大侠五级) | 2019-04-23 16:53

https://bbs.csdn.net/topics/392194253
这里面有这个问题详细讨轮

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:53

@会长: 如果保存为图片背景了,比如画了一条线,很难知道鼠标是否移到这条线上了吧

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:55

@会长: 使用wpf现有控件主要是向交互方便些

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:55

现在考虑是用DrawingVisual试试看效果,但是听说DrawingVisual 的Hit Testing不是很准

beautifulday | 园豆:190 (初学一级) | 2019-04-23 16:58

@会长: 难道最初选wpf绘图就是错误了,这让人纠结

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:00

@beaful:可以吧,知道知道那条线的坐标就可以计算出来

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:02

@beaful: 我试了下加了个图片,速度简直飞起来,就是不到你能解决你说的“交互”问题吗,如果用图片的话

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:03

@会长:

很难吧,

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:06

@会长: 这个是折线,横坐标纵坐标都要记住,但是两个坐标点那一块就不知道了

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:07

@会长: 两个坐标点之间的那一段线段,不知道鼠标是否在上面

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:08

@beaful: 不太明白你说的。等我有空再看看。不好意思,我没时间再研究了。另外你看看楼上发的那个连接,好像可以用。

也可以试试Popup,看能画十字吗

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:09

@会长: 嗯嗯

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:10

@beaful: 我不太明白你说的,我是觉得,只要你能保证图片大大小和canvas重叠,那canvas上的坐标就和图片上的坐标完全一致。那些线啊,方块把把他们的坐标,大小放到内存里。获取当前鼠标的位置就可以计算鼠标距离某个线某个矩形的距离,理论上。

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:11

@会长:
两个点可以坐标可以存内存,但是两个点之间那段线就存不了了

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:16

@beaful: 两个点就够了,两个点确定一条直线,判断一个点是否在直线上初中就学过了。另外也可以把线段的每个点放了数组里。

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:21

@会长: 还是研究研究DrawingVisuals吧,实现起来逻辑太复杂了

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:37

@会长: 谢谢,这么耐心的回答

beautifulday | 园豆:190 (初学一级) | 2019-04-23 17:42

@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)\)在直线上,再加一个条件判断是不是在线性中间而不是延长线上:横坐标大于左侧端点的横坐标且小于右端点的横坐标

会长 | 园豆:6275 (大侠五级) | 2019-04-23 17:53

@beaful: 你最后怎么解决了?

会长 | 园豆:6275 (大侠五级) | 2019-05-14 14:27

@会长: 解决了,用了比较轻型绘图方法

beautifulday | 园豆:190 (初学一级) | 2019-07-18 17:05

@beaful: 使用了缓冲技术,划十字线的时候

beautifulday | 园豆:190 (初学一级) | 2019-07-18 17:07

@beaful: 赞

会长 | 园豆:6275 (大侠五级) | 2019-07-18 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册