2012-01-27 2 views
1

우리에게는 인덱서가있는 Children 컬렉션이있는 캔버스가 있습니다. 우리에게는 어린이 중 한 명에 대한 언급이 있습니다. 우리는 단지 목록에있는 다음 아이를 얻고 싶습니다. 그리고 끝까지 지나면 다시 둘러보기를 원합니다.WPF에서 캔버스에 다음 형제 (배치)를 가져 오는 가장 쉬운 방법은 무엇입니까?

우리는 현재 우리가 가지고있는 색인을 얻기 위해 루핑을 통해이를 수행하고 있습니다. 그런 다음 우리는 그것을 증가시키고, 경계를 확인하고, 필요하다면 줄 바꿈하고, 결과를 사용하여 색인 생성기에서 자식을 얻습니다.

...하지만 그건 저에게 3 대 왼쪽으로가는 느낌입니다. 나는 뭔가를 놓쳐 야한다.

참고 : 인덱스 기반 컬렉션에 대한 일반적인 해결책이 있다면 좋겠지 만 캔버스에만 적용되는 경우에도 마찬가지입니다.

답변

1

내가 뭔가를 누락 될 수 있지만, 난 당신이 쉽게 달성 할 수 원하는 것을 생각 랩 (즉, 하나의 I이

<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; 
    } 
} 

과 같은 코드를 사용할 수 있습니다, 나는 첫번째 요소에 대한 핸들을 가정하고, 다음 잡아하려면 다음 4 옆 잡고 싶어이이 인쇄 :

canvChild2

canvChild1

난 당신이 또한 시각적 트리에 대해 LINQ를 사용할 수 있도록 할 나무 물건에 콜린 Eberhardts 우수한 LINQ를 사용할 수 있다고 생각 : 당신을 수 있습니다 http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree

꽤 편리한 물건입니다, VisualTree를 XML처럼 취급하고 다른 축을 탐색 할 수 있습니다.

+0

아아아! 내가 $ 200에 대해 모르는 것들, Alex! 'IndexOf'! 나는 간단한 것을 놓친다는 것을 알았다. Linq 쿼리 (또는 더 나은, 확장 메서드)에서 내가 원하는 것을 정확하게 제공 할 수 있습니다. (그게 루핑 - 조회에 대한 내 필요성을 제거합니다.) 투표는 당신 (그리고 StackOverflow에 오신 것을 환영합니다!) 귀하의 점수가 빨리 올라갈 것입니다 확신합니다. – MarqueIV

+0

한 제안 : 코드를 게시하면 제거 할 수 있습니다 'usings'를 위로하고 클래스 자체. 관련 방법 만 필요합니다. 또한 이중 빈 줄을 제거하십시오. 이러한 모든 것들은 수평 적으로나 수직적으로 불필요한 스크롤링을합니다. 그래도 훌륭한 코드 예제. 간단하고 명확! – MarqueIV

0

캔버스를 직접 사용해서는 안되며 ItemsControl 캔버스는 ItemsPanel으로 사용해야합니다. 을 사용하여 CurrentItem (MoveCurrentTo*)을 가져오고 이동할 수 있습니다.

+0

흠. 흥미로운 음식 생각이지만 내 질문에는 해당되지 않습니다. 제 말은 ItemsControl이 컬렉션의 다음 항목을 가져 오는 것에 대한 제 질문을 해결할 수있게 해주는 것입니다. – MarqueIV

+0

@MarqueIV :'ItemsControl'은 약간은 제쳐두고,'CollectionViews'와 함께 작동 할 필요는 없을 것입니다 만, 콜렉션과'Canvas' 사이를 분리하는 것이 좋을지도 모릅니다. –

관련 문제