围绕canvas移动矩形

我的应用程序中间有一个canvas,周围有控件。 我有一个接收点的套接字并将它们保存在列表中。

我在canvas上绘制了小的4×4矩形,用于我列表中的点数。比如说4点……还有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) 

所有这些都没有使矩形移动。 是的,我确保数据正在发生变化。

非常感谢。

我认为通过将Canvas.Left和Canvas.Top附加属性绑定到ObservableCollection >可以获得更多漂亮的解决方案,但是当你在这里要求一个老式的WinForms Style解决方案时,你有一些我认为你需要的东西(My在C#中写这个道歉:

XAML:

           

代码背后:

 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 m_Points; private Random m_Random; public MainWindow() { InitializeComponent(); m_Points=new List(); 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; } } } 

使用渲染事件

 CompositionTarget.Rendering += UpdateRectangles; 

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

考虑使用CacheMode =“BitmapCache”。