WPF画图5000个以上,再画十字线鼠标移动很卡,求解决

ai756897728 2017-07-18 10:01:34
代码

Line line1;
Line line2;

private void Main_MouseMove(object sender, MouseEventArgs e)
{
if (line1 != null)
{
main.Children.Remove(line1);
main.Children.Remove(line2);
}
Point p = e.GetPosition(this);
line1 = new Line();
line1.Stroke = Brushes.White;
line1.StrokeThickness = 1;
line1.X1 = 0;
line1.X2 = main.ActualWidth;
line1.Y1 = p.Y;
line1.Y2 = p.Y;
line1.SnapsToDevicePixels = true;
line2 = new Line();
line2.Stroke = Brushes.White;
line2.StrokeThickness = 1;
line2.X1 = p.X;
line2.X2 = p.X;
line2.Y1 = 0;
line2.Y2 = main.ActualHeight;
line2.SnapsToDevicePixels = true;
main.Children.Add(line1);
main.Children.Add(line2);
}

Rectangle rect;
private void button_Click(object sender, RoutedEventArgs e)
{
Random rd = new Random();
for (int i = 0; i < 5000; i++)
{
rect = new Rectangle();
rect.Fill = new SolidColorBrush(Colors.Black);
rect.Stroke = new SolidColorBrush(Colors.White);
rect.Width = 10;
rect.Height = 10;
main_canvas.Children.Add(rect);
Canvas.SetLeft(rect, rd.Next(Convert.ToInt32(main_canvas.ActualWidth)));
Canvas.SetTop(rect, rd.Next(Convert.ToInt32(main_canvas.ActualHeight)));

}

}
...全文
1350 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_123456 2019-07-17
  • 打赏
  • 举报
回复
引用 58 楼 ai756897728 的回复:
[quote=引用 54 楼 ilikeff8 的回复:] 就是我上面写的,加一句this.cachemode=new bitmapcache() 就可以了,测试移动鼠标两万个下没用任何延迟
试过了,但是情况就出现了图形模糊的状态,这样的却不卡,但是图形模糊[/quote]
引用 58 楼 ai756897728 的回复:
[quote=引用 54 楼 ilikeff8 的回复:] 就是我上面写的,加一句this.cachemode=new bitmapcache() 就可以了,测试移动鼠标两万个下没用任何延迟
试过了,但是情况就出现了图形模糊的状态,这样的却不卡,但是图形模糊[/quote] BitmapCache bc = new BitmapCache(); bc.RenderAtScale = 10; canvasImageKline.CacheMode = bc; 设置RenderAtScale 属性值就不模糊了
ilikeff8 2017-07-20
  • 打赏
  • 举报
回复
又不想模糊又不想有任何延迟, 那你干脆把背景处理成一张图片, 加放大缩小啥的功能也容易 点击鼠标的时候,判断点中的是哪个方块,然后单独绘制这个方块,让其可以被控制,然后在背景里去掉这个方块的显示

            protected override void OnRender(DrawingContext dc)
            {
                base.OnRender(dc);

                Random rd = new Random();

                System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red);

                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)SystemParameters.WorkArea.Width, (int)SystemParameters.WorkArea.Height);
                using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
                {
                    for (int i = 0; i < 20000; i++)
                    {
                        int x = rd.Next(Convert.ToInt32(ActualWidth));
                        int y = rd.Next(Convert.ToInt32(ActualHeight));

                        System.Drawing.Rectangle r = new System.Drawing.Rectangle(x, y, 10, 10);

                        graphics.DrawRectangle(pen, r);
                    }

                    graphics.Dispose();
                }

                BitmapImage bitmapImage = new BitmapImage();

                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Bmp);
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = ms;
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImage.EndInit();
                    bitmapImage.Freeze();
                }

                dc.DrawImage(bitmapImage, new Rect(0, 0, bitmap.Width, bitmap.Height));
            }
ai756897728 2017-07-20
  • 打赏
  • 举报
回复
引用 60 楼 duanzi_peng 的回复:
[quote=引用 55 楼 zanfeng 的回复:] [quote=引用 46 楼 duanzi_peng 的回复:] 表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。
你的录相工具不错。给个下载地址 [/quote] 搜索 FastStone Capture[/quote] 把你昨天写的那个代码给我看下,可以吗?
exception92 2017-07-20
  • 打赏
  • 举报
回复
引用 55 楼 zanfeng 的回复:
[quote=引用 46 楼 duanzi_peng 的回复:] 表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。
你的录相工具不错。给个下载地址 [/quote] 搜索 FastStone Capture
ai756897728 2017-07-20
  • 打赏
  • 举报
回复
引用 53 楼 zanfeng 的回复:
刚用winform写了一个例子。表示5000个一点也不卡。
WinForm的却可以,但是要做的是WPF
ai756897728 2017-07-20
  • 打赏
  • 举报
回复
引用 54 楼 ilikeff8 的回复:
就是我上面写的,加一句this.cachemode=new bitmapcache() 就可以了,测试移动鼠标两万个下没用任何延迟
试过了,但是情况就出现了图形模糊的状态,这样的却不卡,但是图形模糊
足球中国 2017-07-20
  • 打赏
  • 举报
回复
足球中国 2017-07-20
  • 打赏
  • 举报
回复
足球中国 2017-07-20
  • 打赏
  • 举报
回复
引用 46 楼 duanzi_peng 的回复:
表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。
你的录相工具不错。给个下载地址
ai756897728 2017-07-20
  • 打赏
  • 举报
回复
引用 64 楼 ai756897728 的回复:
[quote=引用 63 楼 ilikeff8 的回复:]
刚才试了下,好像有点用,我再试试,如果没有问题,我把分给你[/quote] 怎么给你分
ai756897728 2017-07-20
  • 打赏
  • 举报
回复
引用 63 楼 ilikeff8 的回复:
刚才试了下,好像有点用,我再试试,如果没有问题,我把分给你
ilikeff8 2017-07-20
  • 打赏
  • 举报
回复
ai756897728 2017-07-19
  • 打赏
  • 举报
回复
引用 44 楼 liuyuehui110 的回复:
[quote=引用 42 楼 ai756897728 的回复:] [quote=引用 41 楼 liuyuehui110 的回复:] 我觉得应该先把画好的图形保存为图片 然后在画十字线
如果保存为图片,后续的功能就无法实现了,因为还涉及到放大缩小,我不可能说每次放大或者缩小的时候都保存为图片再去读取图片把[/quote] 我还是认为应该先保存为图片,然后清理背景。[/quote] 如果可以的画,能不能给一个例子,但效果需要十字线,放大缩小
  • 打赏
  • 举报
回复
引用 42 楼 ai756897728 的回复:
[quote=引用 41 楼 liuyuehui110 的回复:] 我觉得应该先把画好的图形保存为图片 然后在画十字线
如果保存为图片,后续的功能就无法实现了,因为还涉及到放大缩小,我不可能说每次放大或者缩小的时候都保存为图片再去读取图片把[/quote] 我还是认为应该先保存为图片,然后清理背景。
ai756897728 2017-07-19
  • 打赏
  • 举报
回复
有没有人知道啊
ilikeff8 2017-07-19
  • 打赏
  • 举报
回复
就是我上面写的,加一句this.cachemode=new bitmapcache() 就可以了,测试移动鼠标两万个下没用任何延迟
足球中国 2017-07-19
  • 打赏
  • 举报
回复
刚用winform写了一个例子。表示5000个一点也不卡。
ai756897728 2017-07-19
  • 打赏
  • 举报
回复
引用 50 楼 ai756897728 的回复:
[quote=引用 49 楼 duanzi_peng 的回复:]
[quote=引用 47 楼 ai756897728 的回复:]
[quote=引用 46 楼 duanzi_peng 的回复:]
表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。



但是边线有明显的区别了,没有矢量图的亮度了[/quote]
恩,应该是我录屏的原因。[/quote]

不是录制的原因,是DrawingVisual 本身就不能画矢量图
[/quote]








这两张图有明显的差距,而我要的如果数量加多了,就会变卡,如果不变卡,颜色也不对
exception92 2017-07-19
  • 打赏
  • 举报
回复
引用 50 楼 ai756897728 的回复:
[quote=引用 49 楼 duanzi_peng 的回复:] [quote=引用 47 楼 ai756897728 的回复:] [quote=引用 46 楼 duanzi_peng 的回复:] 表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。 但是边线有明显的区别了,没有矢量图的亮度了
恩,应该是我录屏的原因。[/quote] 不是录制的原因,是DrawingVisual 本身就不能画矢量图 [/quote] 那就不清楚 “既要线不卡,又要高亮”的解决方案了。
ai756897728 2017-07-19
  • 打赏
  • 举报
回复
引用 49 楼 duanzi_peng 的回复:
[quote=引用 47 楼 ai756897728 的回复:] [quote=引用 46 楼 duanzi_peng 的回复:] 表示用DrawingVisual 生成8000+个10*10 的rect + PolyLine 创建的垂直水平线 毫无卡顿的感觉。
但是边线有明显的区别了,没有矢量图的亮度了[/quote] 恩,应该是我录屏的原因。[/quote] 不是录制的原因,是DrawingVisual 本身就不能画矢量图
加载更多回复(46)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧