2012-01-10 8 views
1

ItemsControlを使用してキャンバス上のコレクションのアイテムを配置します。配置はTranslateTransform:<TranslateTransform X="{Binding x}" Y="{Binding y}"/>によって行われます。アイテムをクリック可能にするために、アイテムにMouseLeftButtonUpイベントを実装しました。ItemsControlアイテムをキャンバスに配置した後、Transform(Silverlight 5)を取得します。

以下の完全なコードを参照してください:そのxとyの値、すなわち、私は私の項目のいずれかをクリックしてTranslateTransformの座標を取得できるようにしたい:これで私が把握することはできませんどのような

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

を要素をキャンバス上に配置するために使用されました。

私の考えは、送信者をEllipseにキャストした後、イベントの送信者から取得することでした。 Ellipse myEllipse = (Ellipse)sender;しかし、情報を含むプロパティは表示されません。

私がGeneralTransform gt = myEllipse.TransformToVisual(Application.Current.RootVisual);を使用している場合は、私が描画しているグリッドではなく、RootVisualを基準にしたTransformのみが表示されます。

おそらく私はここで明白な何かを見落としているでしょう。私はどんなヒントにも感謝しています。

+0

あなたは、xを見つけたいとあなたの翻訳変換のy値。あなたのDataContextからバインドされていませんか? DataContextを取得し、xとyの値を調べてください。 –

+0

ありがとうジョシュ、どうすればいい?そして、私は 'DataContext'(xとyの位置値を持つ1000個のアイテム)の' ObservableCollection'を取得した後、どのアイテムがちょうどクリックされたアイテムに対応しているかをどのように知ることができますか? – Phasma

+0

私はこの問題を解決する別の方法を見つけました。下記を参照してください。あなたが描写する方法も可能な場合、ジョシュ、私はそれについてもっと聞きたいと思います。 – Phasma

答えて

0

解決策が見つかりました。 (私の場合はGridは、またLayoutRootである、上に置かれている)別の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にアイテムを配置するために非常に奇妙な方法を使用しています。クリックのサポートを得るのが難しいのはあなたのアプローチです。あなたはあなたのすべてのアイテムをお互いに生き生きとさせるだけです。レイアウトと入力システムはすべてのアイテムが座標系の原点にあると考えていますが、別の場所でレンダリングするだけです。そのため、すべてのマウスイベントは機能しません。

主流のアプローチは、MSDNに示すように、添付プロパティCanvas.LeftCanvas.Topを使用します。 ItemContainerStyleを経由して結合特性を試してみてください。

<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イベントは、ユーザーが非常にアイテムをクリックしたときにのみトリガーされます、そして、あなたがクリックした項目の位置を計算する必要はありません。

+0

ありがとうパベル、それは問題ではありません。いずれかのアイテムをクリックすると、対応するマウスイベントが発生します。問題は、マウスの左ボタンなどのトリガー機能内で何をして、必要なデータを取得するかです。また、Silverlightには 'ItemsControl.ItemContainerStyle'もありません。そのため、アイテムを配置するために' Transform'を使用しています。 – Phasma

+0

@NuitariOops、 'ItemContainerStyle'の私の誤り。うーん、それはWPFに存在します。なぜSLにはないのですか?... –

関連する問題