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)));

}

}
...全文
1622 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] 把你昨天写的那个代码给我看下,可以吗?
  • 打赏
  • 举报
回复
引用 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]








这两张图有明显的差距,而我要的如果数量加多了,就会变卡,如果不变卡,颜色也不对
  • 打赏
  • 举报
回复
引用 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)
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

111,129

社区成员

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

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

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