2010-09-04 6 views
1

J'ai une toile au milieu de mon application avec des contrôles autour de celle-ci. J'ai un socket qui reçoit des Points et les enregistre dans une liste.Déplacer un rectangle autour d'une toile

Je dessine de petits rectangles 4x4 sur le canevas pour le nombre de points dans ma liste. disons qu'il y a 4 points .. theres 4 rectangles.

Je veux être en mesure de déplacer les rectangles lorsque les points changent avec le code. est-ce possible sans story-boards ou aucune classe 'animation'? et comment pourrais-je faire ce dont j'ai besoin?

J'ai essayé:

 'cMap.Children.Remove(r) 

     'Dim nr As Rectangle = New Rectangle() With {.Width = 4, .Height = 4, .Name = "r" & P.Name, .Fill = Brushes.Red} 
     'r.RenderTransform = New TranslateTransform(P.Position.X, P.Position.Y) 

     Canvas.SetTop(cMap.Children(cMap.Children.IndexOf(r)), (512/2) + P.Position.Y) 
     Canvas.SetLeft(cMap.Children(cMap.Children.IndexOf(r)), (512/2) + P.Position.X) 
     'nr.SetValue(Canvas.TopProperty, (512/2) + P.Position.Y) 
     'nr.SetValue(Canvas.LeftProperty, (512/2) + P.Position.X) ' P.Position.X) 
     'cMap.Children.Add(nr) 

tous ceux mais aucun font les rectangles se déplacent. et oui je me suis assuré que les données changent.

merci beaucoup.

Répondre

1

Je pense que des solutions plus astucieuses sont disponibles en associant les propriétés Canvas.Left et Canvas.Top à une ObservableCollection <Point>, mais comme vous avez demandé une solution WinForms Style à l'ancienne, vous avez quelque chose qui fait ce que je pense besoin (Mes excuses pour écrire cela en C#):

XAML:

<Window x:Class="MovingPointsSpike.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="650" Width="525" 
     > 
    <StackPanel> 
     <Border BorderThickness="1" BorderBrush="Gray"> 
      <Canvas Name="PointCanvas" Width="500" Height="500"/> 
     </Border> 
     <Button Name="Move" Click="Move_Click">Move Random Point</Button> 
     <Button Name="Add" Click="Add_Click">Add Point</Button> 
     <Button Name="Remove" Click="Remove_Click">Remove Random Point</Button> 
    </StackPanel> 
</Window> 

code derrière:

using System; 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 
using System.Windows.Shapes; 

namespace MovingPointsSpike 
{ 

    public partial class MainWindow : Window 
    { 
     private List<Point> m_Points; 
     private Random m_Random; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      m_Points=new List<Point>(); 
      m_Random=new Random(); 
     } 

     private void Move_Click(object sender, RoutedEventArgs e) 
     { 
      Rectangle rectangle; 
      Point newPoint; 
      int index = GetRandomIndex(); 
      newPoint = GetRandomPoint(); 

      rectangle =(Rectangle)PointCanvas.Children[index]; 
      if (index == -1) return; 
      Canvas.SetTop(rectangle, newPoint.Y); 
      Canvas.SetLeft(rectangle, newPoint.X); 
     } 

     private void Add_Click(object sender, RoutedEventArgs e) 
     { 
      Point newPoint; 
      Rectangle rectangle; 

      newPoint = GetRandomPoint(); 
      rectangle = new Rectangle {Width = 4, Height = 4, Fill = Brushes.Red}; 
      m_Points.Add(newPoint); 
      PointCanvas.Children.Add(rectangle); 
      Canvas.SetTop(rectangle,newPoint.Y); 
      Canvas.SetLeft(rectangle,newPoint.X); 
     } 

     private Point GetRandomPoint() 
     { 
      int x; 
      int y; 
      x = m_Random.Next(10, 490); 
      y = m_Random.Next(10, 490); 
      return new Point(x,y); 
     } 

     private void Remove_Click(object sender, RoutedEventArgs e) 
     { 
      int index = GetRandomIndex(); 
      if (index==-1)return; 

      PointCanvas.Children.RemoveAt(index); 
      m_Points.RemoveAt(index); 

     } 

     private int GetRandomIndex() 
     { 
      int index; 
      if (m_Points.Count==0) return -1; 
      index = m_Random.Next(m_Points.Count - 1); 
      return index; 
     } 
    } 
} 
+0

voir que j'ai essayé les Canvas.S etTop (rectangle, newPoint.Y); chose qu'il ne bouge tout simplement pas. – tcables

+1

Ah, voyez la chose que j'ai mal faite, c'est que je remplaçais chaque point par un nouveau point, au lieu de mettre à jour le point ... ce qui causait un problème entre les threads. – tcables

0

Utilisation événement rendu

CompositionTarget.Rendering += UpdateRectangles; 

...

protected void UpdateRectangles(object sender, EventArgs e) 
{ 
    // here some stuff 
    Canvas.SetLeft(rectangle, location); 

} 

Pensez à utiliser CacheMode = "BitmapCache" pour eux.

Questions connexes