Re: [问题] wpf后台ellips圆心如何在canvas中定位

楼主: lightyen (lightyen)   2018-01-16 20:52:55
※ 引述《jamyang (Jack)》之铭言:
: 在wpf中,根据模拟data随时会要在canvas中画出正确xy点,同时间画面大约会有500点
: 而且画面会一直更新而成动画,更新速度越快越好(所以才从winform转为wpf)
: 由于点会从data产生,所以只能在后台写
: 问题1:
: Ellips要在指定的位置出现,是要使用什麻属性呢?
: 遍寻MSDN不著,卡住了
: 问题2:
: 大致上就是在timer里面做Ellipse物件的增减并刷新canvas
: 目前刷新的方法是直接
: canvas.Child.clear();
: canvas.Child.Add(Ellips1);
: canvas.Child.Add(Ellips2);
: ......
: 不过这样的动画好像还是不太顺,是否有更顺畅的做法呢
: 最近改用wpf写程式,实在很不熟练
: 先感谢了
Q1:
设定Ellipse的Margin属性 left以及top
Q2:
由于每当Canvas加入item的时候会触发重绘
所以在产生500个点的过程中会不断的重绘Canvas
很显然并不符合需求
所以我们得自己建立一个新的Canvas
继承System.Windows.Control.Canvas
然后去复写OnRender来改变Render的行为
但是还是有个问题
因为每当canvas.Children.Add项目之后就会触发OnRender
虽然我们可以让他在第500个点产生完后再画
但也是产生了不少且没必要的overhead
/******************/
为了良好的使用者体验
这里我推荐使用绘图API去做 例如DirectX或OpenGL等等
"蛤? 你问我DirectX不是unmanaged的C/C++吗?"
"那就掺在一块做撒尿牛丸就好啦!"
尽管DirectX大部分开发时都是C/C++
但我们还是可以透过HwndHost和InteropServices
让WPF可以去装载传统Win32视窗
以及存取C/C++的API
献丑:
https://git.io/vNlzk
在这里我使用的是SharpDX来省下一堆麻烦(还是很麻烦就是了XD)
程式码大意是首先建立一个Win32视窗然后装进WPF
接着建立DirectX所需要的资源环境
把Win32视窗的Handle丢给DirectX
然后在按下Button的时候建立一个线程
并在里面的循环内设计显示逻辑
这里示范是随机取500个点存进List
然后在一个一个绘出
做完一个Frame之后会先睡个16ms 以免太占系统资源
实作环境: VS2017和.NET 4.7.1
食用前先请还原Nuget以下载SharpDX套件
作者: jamyang (Jack)   2018-01-16 22:15:00
十分感谢指引,虽然看起来整个要大翻修,但是总算有个方向

Links booklink

Contact Us: admin [ a t ] ucptt.com