【问题标题】:Move a rectangle around a canvas在画布周围移动一个矩形
【发布时间】:2010-09-04 19:14:33
【问题描述】:

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

我在画布上为列表中的点数绘制了 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)

... 这些都不会使矩形移动。我还确保数据正在发生变化;没有运气。

【问题讨论】:

    标签: c# wpf vb.net canvas


    【解决方案1】:

    我认为通过将 Canvas.Left 和 Canvas.Top 附加属性绑定到 ObservableCollection<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;
            }
        }
    }
    

    【讨论】:

    • 看我试过 Canvas.SetTop(rectangle,newPoint.Y);它只是不移动它。
    • 啊,看看我做错的事情是我用一个新点覆盖每个点,而不是更新点......这导致线程之间出现问题。
    【解决方案2】:

    使用渲染事件

    CompositionTarget.Rendering += UpdateRectangles;
    

    ...

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

    考虑为它们使用 CacheMode="BitmapCache"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2015-10-22
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多