我只使用WPF幾個月,但我有一個廣泛的WinForm,ASP.NET和Flex背景。我試圖畫一個用戶控件,看起來像下面的IMAGE。WPF和C# - 問題與GeneralTransform和UIElement.TransformToVisual
我們正在使用MVVM模式。首次加載用戶控件時,所有內容都可以正確繪製。該控件由一個畫布組成。在畫布內存在一個徑向面板,它將在幾何上放置添加的UIElements。圓形節點被拉入放射面板。所示的PolyLines畫在畫布上。我通過使用GeneralTransform和對UIElement.TransformToVisual的調用來獲得PolyLine的端點。呼叫中的UIElement是放射面板中的藍色節點,並且正在使用放射面板進行轉換。第一次加載控件時,所有內容都可以正確繪製。失敗的地方是MVVM模式通知繪圖更新。
當我嘗試基於系統更新進行刷新時,我已確認我的所有集合都包含正確的數據。所以MVVM模式的行爲應該像它應該。但是,當我嘗試繪製線條時,對TransformToVisual的調用將返回0,0的點,而不是它在加載過程中的值。這會導致我的多段線在控件的左上角繪製,而不是連接兩個節點。
下面是操作順序:
1)用戶控制負荷將建立用於繪製控制我的收藏品。這些集合是在用戶控件本地構建的,數據來自駐留在視圖模型中的主集合。用戶控件將自身的刷新方法註冊到UI刷新廣播消息。
2)用戶嘗試通過嚮導連接兩個藍色節點。連接器被保存並且刷新UI消息被廣播。
3)User Control調用Refresh方法。在這裏,我正在循環畫布的子項並移除PolyLines。我也打電話給radialPanel.Children.Clear。然後我執行加載時構建我的集合的相同代碼。然後,我使用我的用戶控件來調用OnRender。然後OnRender將嘗試繪製多段線來連接節點。節點始終放置在放射面板中。
4)連線動作是從OnRender調用的。在它內部,我使用GeneralTransform gt = node.TransformToVisual(radialPanel)。當用戶控件「刷新」時,此調用總是返回0,0,但始終爲控件的第一個加載。
我相當積極的問題在於我如何刷新基於網絡通知的用戶控件。我試圖清除控件,然後重新執行相同的加載操作,但仍然沒有運氣。我對用戶控件執行了InvalidateVisual,並試圖在我的覆蓋中執行所有操作。OnRender仍然沒有運氣; 0,0仍然返回。
有沒有人對GeneralTransform可能發生什麼有什麼想法?我處於死衚衕,任何新的道路都會有所幫助。