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