更新PointCollection中的点

所以我正在使用一个开关和灯泡系统,它们通过电线连接在一起。 我应该让开关可以拖动,这样电线也会移动。 既然你不能直接在PointCollection中更新积分(我认为它们是我认为的结构?),我已经找到了一种方法,但这看起来非常冗长,我认为必须有更好的方法来做到这一点。

基本上我检索点,进行操作,清除集合,并添加新点:

Point firstPoint = new Point(firstPointCollection[0].X, firstPointCollection[0].Y + offset.Y); Point secondPoint = new Point(firstPointCollection[1].X + offset.X, firstPointCollection[1].Y + offset.Y); Point thirdPoint = new Point(firstPointCollection[2].X + offset.X, firstPointCollection[2].Y + offset.Y); firstPointCollection.Clear(); firstPointCollection.Add(firstPoint); firstPointCollection.Add(secondPoint); firstPointCollection.Add(thirdPoint); 

在具有多个线路的系统中,所有线路都由多个点组成,这很快就会变得非常繁琐。 这一切都必须在C#中完成,但是如果有更好的方法可以使用某种数据绑定,请告诉我。

好吧,整个事情可以通过数据绑定来完成,所以当你更新灯泡的位置时它会自动更新UI,在这里留下我的代码示例有点长..

这个演示的结果只是一些带有线条的圆圈,但你可以根据需要对其进行模板化。

在此处输入图像描述

xaml窗口,这声明了一个项目控件,它将显示灯泡(和连接它们的线条)

                          

这就是cs,我创建了一个灯泡结构,它保存了灯泡的X和Y位置以及链条中下一个灯泡的参考,我已将所有灯泡放入一条线然后只是移动了Y.元素5的位置稍微低一点以显示它的更新。

 using System.Collections.ObjectModel; using System.Windows; namespace points { public class Bulb : DependencyObject { public double X { get { return (double)GetValue(XProperty); } set { SetValue(XProperty, value); } } public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(double), typeof(Bulb), new PropertyMetadata(0d)); public double Y { get { return (double)GetValue(YProperty); } set { SetValue(YProperty, value); } } public static readonly DependencyProperty YProperty = DependencyProperty.Register("Y", typeof(double), typeof(Bulb), new PropertyMetadata(0d)); public Bulb NextBulb { get { return (Bulb)GetValue(NextBulbProperty); } set { SetValue(NextBulbProperty, value); } } public static readonly DependencyProperty NextBulbProperty = DependencyProperty.Register("NextBulb", typeof(Bulb), typeof(Bulb), new PropertyMetadata(null)); } public partial class MainWindow : Window { public ObservableCollection Bulbs { get { return (ObservableCollection)GetValue(BulbsProperty); } set { SetValue(BulbsProperty, value); } } public static readonly DependencyProperty BulbsProperty = DependencyProperty.Register("Bulbs", typeof(ObservableCollection), typeof(MainWindow), new PropertyMetadata(null)); public MainWindow() { Bulbs = new ObservableCollection(); InitializeComponent(); for (int i = 0; i < 10; i++) { double x = i * 50; double y = 25; Bulbs.Add(new Bulb() { X = x, Y = y, NextBulb = i > 0 ? Bulbs[i - 1] : null, }); } Bulbs[5].Y = 50; } } } 

这样做的结果是以任何方式改变灯泡结构将更新UI上的灯泡显示,而不必每次都清除并重新创建您的集合,您甚至可以在属性上运行动画以获得一些非常酷的效果。

首先, Offset()方法

正如Amnestic指出的那样,即使Point是一个结构体,你也可以通过Offset方法对其进行变异。 但是,由于他在使用索引器时使用的是PointCollection而不是Points数组,因此您将获得结构的副本,而不是原始结构。

如果积分在Point []中你可以使用这个:

 firstPointCollection[0].Offset(x, y) 

但是因为我们使用的是PointCollection,您需要将索引器设置为:

 firstPointCollection[0] = firstPointCollection[0].Offset(x, y) 

关于结构是否应该是可变的讨论是另一个鱼的水壶。