2011-02-04 68 views
0

我只使用WPF幾個月,但我有一個廣泛的WinForm,ASP.NET和Flex背景。我試圖畫一個用戶控件,看起來像下面的IMAGEWPF和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可能發生什麼有什麼想法?我處於死衚衕,任何新的道路都會有所幫助。

回答

0

我想通了。所以我發佈了答案,以防其他人處理這個問題。

問題是我沒有強制徑向面板MeasureOverride和ArrangeOverride試圖繪製線條之前。如果沒有這兩個調用,那麼在我連接線路時,節點位於0,0位置。通過強制他們在繪製線條之前調用,TransformToVisual正常工作。