我們有一個帶有索引器的兒童系列的畫布。我們提及一個孩子。我們只想讓下一個孩子進入列表,如果我們走到最後,我們想再次環繞。在WPF的畫布上獲取下一個兄弟(包裝)的最簡單方法是什麼?
我們目前正在通過循環來獲取我們擁有的索引,然後我們增加它,檢查邊界並在必要時進行換行,然後使用該結果從索引器獲取子...
......但這只是感覺如此左右走向我。我必須失去一些東西。
注意:如果對於任何基於索引的集合有一個通用的解決方案,那將非常棒,但即使它只是特定於畫布,也沒關係。
我們有一個帶有索引器的兒童系列的畫布。我們提及一個孩子。我們只想讓下一個孩子進入列表,如果我們走到最後,我們想再次環繞。在WPF的畫布上獲取下一個兄弟(包裝)的最簡單方法是什麼?
我們目前正在通過循環來獲取我們擁有的索引,然後我們增加它,檢查邊界並在必要時進行換行,然後使用該結果從索引器獲取子...
......但這只是感覺如此左右走向我。我必須失去一些東西。
注意:如果對於任何基於索引的集合有一個通用的解決方案,那將非常棒,但即使它只是特定於畫布,也沒關係。
我可能失去了一些東西,但我想你想可以很容易實現的,說我有這樣
<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,並導航不同的軸。
您可能不應該直接使用畫布,而應使用ItemsControl
,畫布爲ItemsPanel
。您也可以在項目頂部使用CollectionView
,這樣可以讓您獲得並移動CurrentItem
(MoveCurrentTo*
)。
嗯。有趣的思想食物,但不適用於我的問題。我的意思是ItemsControl爲了解決我有關獲取集合中下一個項目的問題而給你的東西? – MarqueIV 2012-01-27 12:37:13
@MarqueIV:'ItemsControl'有點不同,你可能不需要它來處理'CollectionViews',但是在集合和'Canvas'之間進行這種分離可能是一件好事。 – 2012-01-27 14:40:53
Aaaah!我不知道的200美元,亞歷克斯! 'IndexOf'!我知道我錯過了一些簡單的事情。我可以在Linq查詢中使用它(或更好的擴展方法),以準確地給我想要的東西。 (這消除了我對循環查找的需要)投票是你的(...並且歡迎來到StackOverflow!我相信你的分數會很快上升。) – MarqueIV 2012-01-30 04:49:50
順便說一句,一個建議:發佈代碼時,你可以消除'使用'頂部和類本身。你只需要相關的方法。另外,嘗試刪除雙空行。所有這些東西都會導致不必要的水平和垂直滾動。仍然是偉大的代碼示例。簡單明瞭! – MarqueIV 2012-01-30 04:53:18