2010-09-04 3 views
1

У меня есть холст в середине моего приложения с элементами управления вокруг него. У меня есть сокет, который получает очки и сохраняет их в списке.Перемещение прямоугольника вокруг холста

Я рисую небольшие 4x4 прямоугольники на холсте для количества очков в моем списке. сказать theres 4 балла. Theres 4 прямоугольника.

Я хочу иметь возможность перемещать прямоугольники при изменении точек с помощью кода. это возможно без раскадровки или любого «анимационного» класса? и как я буду делать то, что мне нужно?

Я попытался:

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

все те, но ни сделать прямоугольники двигаться. и да, я убедился, что данные меняются.

спасибо большое.

ответ

1

Я думаю, что более гибкие решения можно получить, привязав Canvas.Left и Canvas.Top прикрепленные свойства к ObservableCollection <Point>, но поскольку вы попросили старомодное решение WinForms Style здесь, у вас есть что-то, что делает то, что я думаю, что вы потребность (Мои извинения за то, пишу это в 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> 

Код:

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

см Я попытался Canvas.S etTop (прямоугольник, newPoint.Y); вещь, которую она просто не двигает. – tcables

+1

Ах, посмотрим, что я сделал неправильно, я переписывал каждую точку с новой точкой, а не обновлял точку ..., которая вызвала проблему между потоками. – tcables

0

Использование визуализации событий

CompositionTarget.Rendering += UpdateRectangles; 

...

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

} 

Рассмотрите возможность использования CacheMode = "BitmapCache" для них.

Смежные вопросы