代码之家  ›  专栏  ›  技术社区  ›  tcables

在画布周围移动矩形

  •  1
  • tcables  · 技术社区  · 15 年前

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

    我在画布上为列表中的点数绘制小的4x4矩形。 假设有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)
    

    所有这些,但没有使矩形移动。 是的,我已经确认了数据的变化。

    非常感谢。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Dabblernl    15 年前

    我认为通过将canvas.left和canvas.top附加属性绑定到一个可观察的集合中,可以获得更多漂亮的解决方案。 <Point >,但是当您在这里要求一个老式的Winforms风格的解决方案时,您有一些可以满足我认为您需要的功能(我为用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;
            }
        }
    }
    
        2
  •  0
  •   Lukasz Madon    15 年前

    使用呈现事件

    CompositionTarget.Rendering += UpdateRectangles;
    

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

    考虑对它们使用cacheMode=“bitmapcache”。