2011-09-16 30 views
1

我需要開發一個WPF自定義控件來顯示無線網狀網絡中節點的佈局和連接。用戶需要能夠拖動節點。如果元素從可用空間中拖出,畫布應該長大並且滾動條應該按需要顯示。可能需要放大/縮小功能。 我的第一件事就是使用ListBox派生的CustomControl和基於Canvas的ItemsPanelTemplate。爲了讓事情進展我使用Josh Smiths DragCanvas允許拖動畫布的UIElements子元素。我的「節點」類目前不是UIElement派生的(DragCanvas目前正在處理包裹我節點的ListBoxItems)。
1.這是一個有理有據的方法,還是我應該放棄ListBox的想法並進行更低級別的操作?
2.我必須覆蓋節點間的鏈接線 - 目前還不確定如何去解決這個問題(作爲ControlTemplate一部分的UIElement類)
3.有些人似乎很頭疼Canvases中的滾動條 - 這會成爲一個問題嗎?
任何一般或具體的建議最受讚賞。 Basic target look of final controlWPF CustomControl設計建議

回答

1

哇,作爲一個控制不壞!

我正在做類似的事情,但並不那麼簡單。

1)恕我直言,DragCanvas是託管+拖動元素的基本方式。由於你將不得不再次託管標籤(節點),弧線和標籤(弧線的重量),我認爲DragCanvas比自己編寫自定義控件更困難。

並非所有事情都可以通過模板化來實現:有時候要比「舊」的方式更像winforms,甚至是混合的方式。 2)如前所述,我會創建一個Canvas派生面板,它將託管多個UIElements(標籤,弧等)。所有這些應該由model + viewmodel來管理。這一開始有點困難,但它會在未來給你很多滿意和靈活性。

3)我不認爲帆布會給你任何頭痛!一個充滿元素的畫布一直是零的大小。這導致那些試圖添加滾動查看器的人「頭疼」。

相反,Canvas派生類(上面)應該重寫MeasureOverride方法,以便其大小適合任何託管對象。但是,你不能使用負座標(這會導致滾動問題),這有點煩人。

很難用幾行描述類似「編輯器」背後的所有工作。這項任務並不容易,問題很多。

希望它有幫助,無論如何。

乾杯

+0

嗨馬里奧 - 感謝您的意見。是的,我同意你對DragCanvas的評論。從你在2)中的意見中可以讀到,這意味着你會從ListBox基礎中取出並直接從Canvas派生自定義控件?一方面,我看到ListControl或ItemsControl對於選擇等是有用的,但是另一方面,它們不一定適合於元素之間存在交互(弧和弧權重)的模型。 – Ricibob

+0

問題本身它是一個ItemsControl映射一組唯一的對象(例如節點),但是您應該將弧與它們的權重進行映射。由於它們不是*相同的控件,因此應該將兩個或三個ItemsControl混合在一起,而且我覺得很麻煩,而不是使用自定義解決方案。 我真的很喜歡WPF及其方法,但有時候是一種矯枉過正。 –

+0

好吧我想研究直接從Canvas派生控件並管理對象(節點和弧/鏈接)我的自我 - 我會看看如何看看,也許看到其他人是否有任何輸入。乾杯。 – Ricibob