2012-01-27 26 views
1

インデクサー付きのChildrenコレクションを持つキャンバスがあります。私たちは子供の一人への言及を持っています。リスト内の次の子を取得したいだけです。最後を過ぎると、もう一度折り返したいと思っています。WPFのキャンバスで次の兄弟(ラッピング)を取得する最も簡単な方法は何ですか?

私たちは現在、私たちが持っているもののインデックスを取得するためにループでこれをやっています。そして、それを増やし、必要ならば範囲とラップをチェックし、その結果をインデクサーから取得します...

...しかし、それはちょうど私に3つの左に行く権利を感じる。私は何かを欠いている必要があります。

注:インデックスベースのコレクションには一般的な解決策がありますが、これは素晴らしいことですが、キャンバス固有のものであっても問題ありません。

答えて

1

が、私は何かが欠けていることができ、私はあなたが簡単に達成することができた何をしたいと思います、ラップ(すなわち、1つの私は、この

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

のようないくつかのXAMLは、その後、あなたが必要とするすべての安全指標をつかむためにある持っていると言います)ので、私はこの

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

私はあなたにも、あなたがビジュアルツリーに対してLINQを使用することができるようになる木のもの、にコリンEberhardts優れたLINQを使用することができると思いcanvChild1

http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree

かなり便利なものです、あなたが可能にXMLと同じようにVisualTreeを扱い、異なる軸をナビゲートします。

+0

Aaaah!私が200ドルで知りませんでした、アレックス! 「IndexOf」!私は何かが簡単でないことを知っていた。私はそれを私が望むものを正確に与えるためにLinqのクエリ(あるいはそれ以上の拡張メソッド)で使うことができます。 (これはループルックアップの必要性を排除します。)投票はあなたのものです(... StackOverflowへようこそ!あなたの得点はすぐに上がると思います) – MarqueIV

+0

提案:コードを投稿すると、 「使用している」という言葉とクラスそのもの。関連する方法だけが必要です。また、二重空白行を削除してみてください。それらのすべては、水平方向と垂直方向の両方で不必要なスクロールを行います。それでも、素晴らしいコード例。シンプルでクリア! – MarqueIV

0

カンバスを直接使用しないでください。ItemsControlではキャンバスをItemsPanelとして使用します。項目の上にCollectionViewを使用して、CurrentItemMoveCurrentTo*)を取得して移動させることもできます。

+0

Hmmm。興味深い思考の食べ物ですが、私の質問には当てはまりません。私は、ItemsControlがコレクションの次のアイテムを取得することに関する私の質問を解決するためにあなたに与えることは何ですか? – MarqueIV

+0

@MarqueIV: 'ItemsControl'はちょっとしたことですが、おそらく' CollectionViews'で動作する必要はありませんが、コレクションと 'Canvas'の間にこのような分離があると良いかもしれません。 –

関連する問題