2012-01-10 2 views
1

I 항목을 ItemsControl을 사용하여 캔버스의 컬렉션에서 가져옵니다. 위치 지정은 TranslateTransform : <TranslateTransform X="{Binding x}" Y="{Binding y}"/>에 의해 수행됩니다. 항목을 클릭 가능하게 만들기 위해 항목에 MouseLeftButtonUp 이벤트를 구현했습니다.ItemsControl 항목을 캔버스에 배치 한 후 Transform (Silverlight 5)

내가 알아낼 수 없습니다 무엇
<ItemsControl ItemsSource="{Binding XYPoints}"> 

    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Ellipse Width="20" Height="20" Fill="Red" MouseLeftButtonUp="XYPlotPoint_MouseLeftButtonUp"> 
       <Ellipse.RenderTransform> 
        <TransformGroup> 
         <RotateTransform Angle="0"/> 
         <TranslateTransform X="{Binding x}" Y="{Binding y}"/> 
        </TransformGroup> 
       </Ellipse.RenderTransform> 
       </Ellipse > 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 

</ItemsControl> 

은 이것이다 :

아래의 전체 코드를 참조하십시오 I는 x와 y 값, 즉 내 항목 중 하나를 클릭하고 TranslateTransform 좌표를 얻을 수 있도록하려면를 그 캔버스에 요소를 배치하는 데 사용되었습니다.

내 아이디어는 보낸 사람을 타원 (Ellipse)으로 다시 캐스팅 한 후 이벤트를 보낸 사람에게이 아이디어를 전달하는 것이 었습니다. Ellipse myEllipse = (Ellipse)sender;하지만 정보가 포함 된 속성이 표시되지 않습니다.

GeneralTransform gt = myEllipse.TransformToVisual(Application.Current.RootVisual);을 사용하는 경우 그리드를 그리는 것이 아니라 RootVisual과 관련된 변환 만 제공합니다.

아마 여기서 분명히 드러난 부분을 간과 할 것입니다. 나는 어떤 힌트라도 감사 할 것이다.

+0

당신은 X를 찾으려하고 변환 변환의 y 값. DataContext에서 바인드되지 않았습니까? 그냥 DataContext 얻고 x 및 y 값을 검사하십시오. –

+0

고마워요 조쉬, 어떻게 그럴 수 있니? 그리고 x와 y 위치 값을 가진 1000 개의 아이템의 'ObservableCollection' 인'DataContext'를 얻은 후에 방금 클릭 한 아이템이 어떤 아이템인지 알 수 있습니까? – Phasma

+0

다른 해결책을 찾았습니다. 아래를 참조하십시오. 당신이 묘사하는 방식도 가능하다면, Josh, 그것에 대해 더 많이 듣고 싶습니다. – Phasma

답변

0

해결책을 찾았습니다. (또한 LayoutRootGrid가가에 위치 내 경우에) 다른 UIElement에 상대를 클릭 한 있다는 UIElement (내 항목)의 변환 얻으려면 :

 private void XYPlotPoint_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     //cast sender to original type 
     Ellipse myEllipse = (Ellipse)sender; 

     //get the transform relative to the LayoutRoot 
     GeneralTransform gt = myEllipse.TransformToVisual(LayoutRoot); 

     //transform a new point to get the coordinates 
     var myUiElementPosition = gt.Transform(new Point(0, 0)); 
    } 
0

귀하의 문제가 무엇인지 잘 모르겠습니다 만, 문제가 있다고 생각합니다.

Canvas에 항목을 배치하는 데 매우 이상한 접근 방식을 사용하고 있습니다. 클릭 지원을 받기가 어렵게 만드는 것은 귀하의 접근 방식입니다. 너는 너의 모든 물건을 서로 살려 두는 것 뿐이야. 레이아웃과 입력 시스템은 모든 항목이 좌표계 원점에 있다고 생각하는 반면, 다른 위치에서 렌더링하면됩니다. 이것이 모든 마우스 이벤트가 작동하지 않는 이유입니다.

주류 접근 방식은 첨부 된 속성 Canvas.Left과 을 사용하며, MSDN으로 표시됩니다. 이처럼 그것을하면 사용자가 매우 항목을 클릭 할 때만

<ItemsControl ItemsSource="{Binding XYPoints}"> 

    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas/> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Ellipse Width="20" Height="20" Fill="Red" MouseLeftButtonUp="XYPlotPoint_MouseLeftButtonUp"/> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 

    <ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="Canvas.X" Value="{Binding x, Mode=TwoWay}"/> 
     <Setter Property="Canvas.Y" Value="{Binding y, Mode=TwoWay}"/> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 

</ItemsControl> 

, 당신의 MouseLeftButtonUp 이벤트가 트리거됩니다, 당신은 클릭 한 항목의 위치를 ​​계산할 필요가 없습니다 다음 ItemContainerStyle를 통해 속성을 결합하십시오 .

+0

감사 파벨,하지만 그건 문제가 아닙니다. 항목 중 하나를 클릭하면 해당 마우스 이벤트가 실행되고 질문은 원하는 데이터를 얻기 위해 트리거 기능 (예 : MouseLeftButtonUp 내부)에서 수행 할 작업입니다. 또한 Silverlight에는'ItemsControl.ItemContainerStyle'이 없으므로 항목을 배치하는 데 '변환'을 사용하고 있습니다. – Phasma

+0

@Nuitari 죄송합니다. 'ItemContainerStyle'에 대한 잘못입니다. 젠장, WPF에 존재합니다. 왜 SL에없는거야? ... –

관련 문제