2012-01-27 54 views
1

我們有一個帶有索引器的兒童系列的畫布。我們提及一個孩子。我們只想讓下一個孩子進入列表,如果我們走到最後,我們想再次環繞。在WPF的畫布上獲取下一個兄弟(包裝)的最簡單方法是什麼?

我們目前正在通過循環來獲取我們擁有的索引,然後我們增加它,檢查邊界並在必要時進行換行,然後使用該結果從索引器獲取子...

......但這只是感覺如此左右走向我。我必須失去一些東西。

注意:如果對於任何基於索引的集合有一個通用的解決方案,那將非常棒,但即使它只是特定於畫布,也沒關係。

回答

1

我可能失去了一些東西,但我想你想可以很容易實現的,說我有這樣

<Canvas x:Name="canv"> 
    <Rectangle x:Name="canvChild1"/> 
    <Rectangle x:Name="canvChild2"/> 
    <Rectangle x:Name="canvChild3"/> 
    <Rectangle x:Name="canvChild4"/> 
</Canvas> 

一些XAML然後,所有你需要的是抓住一個安全的指標(即一個包),所以假設我有一個句柄第1個要素,以及接下來要搶,然後第4,並希望接下來的搶,我可以用這樣的代碼

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Debug.WriteLine(GetSafeElementForIndex(
      this.canv.Children.IndexOf(canvChild1)).Name); 

     Debug.WriteLine(GetSafeElementForIndex(
      this.canv.Children.IndexOf(canvChild4)).Name); 
    } 


    private FrameworkElement GetSafeElementForIndex(int currentIndex) 
    { 
     return (FrameworkElement)this.canv.Children[WrappedIndex(++currentIndex)]; 
    } 


    private int WrappedIndex(int currentIndex) 
    { 
     return currentIndex % this.canv.Children.Count; 
    } 
} 

此打印此:

canvChild2

canvChild1

我想你也可以使用科林Eberhardts優秀的LINQ到樹的東西,這將允許您使用LINQ對視覺樹:http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree

這是非常方便的東西,它允許你像處理XML一樣處理VisualTree,並導航不同的軸。

+0

Aaaah!我不知道的200美元,亞歷克斯! 'IndexOf'!我知道我錯過了一些簡單的事情。我可以在Linq查詢中使用它(或更好的擴展方法),以準確地給我想要的東西。 (這消除了我對循環查找的需要)投票是你的(...並且歡迎來到StackOverflow!我相信你的分數會很快上升。) – MarqueIV 2012-01-30 04:49:50

+0

順便說一句,一個建議:發佈代碼時,你可以消除'使用'頂部和類本身。你只需要相關的方法。另外,嘗試刪除雙空行。所有這些東西都會導致不必要的水平和垂直滾動。仍然是偉大的代碼示例。簡單明瞭! – MarqueIV 2012-01-30 04:53:18

0

您可能不應該直接使用畫布,而應使用ItemsControl,畫布爲ItemsPanel。您也可以在項目頂部使用CollectionView,這樣可以讓您獲得並移動CurrentItemMoveCurrentTo*)。

+0

嗯。有趣的思想食物,但不適用於我的問題。我的意思是ItemsControl爲了解決我有關獲取集合中下一個項目的問題而給你的東西? – MarqueIV 2012-01-27 12:37:13

+0

@MarqueIV:'ItemsControl'有點不同,你可能不需要它來處理'CollectionViews',但是在集合和'Canvas'之間進行這種分離可能是一件好事。 – 2012-01-27 14:40:53

相關問題