Переместить прямоугольник вокруг холста - PullRequest
1 голос
/ 04 сентября 2010

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

Я рисую на холсте маленькие прямоугольники 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 ]

1 голос
/ 05 сентября 2010

Я думаю, что более изящные решения доступны благодаря привязке свойств, прикрепленных к 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;
        }
    }
}
0 голосов
/ 05 сентября 2010

Использовать событие рендеринга

CompositionTarget.Rendering += UpdateRectangles;

...

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

 }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...