我有一个如下定义的点列表:
private List<Point> points = new List<Point>();
我想通过以下函数在给定的画布上绘制:
private void draw_all_points_on_canvas(Canvas canvas_name, List<Point> points);
我的问题是:如何实现在数据points
更改时自动调用此绘图函数的目标?
PS:这个问题似乎非常类似于使数据成为ObservableCollection
(ObservableCollection<Point> points
),然而,由于我不能使用canvas_name.ItemsSource = points;
,我还需要定义如何在绘图函数中在画布上绘制这些点。
答案 0 :(得分:2)
是的,您需要ObservableCollection
并挂钩其CollectionChanged
事件,这是在数据发生变化时通知wpf的方式。
private ObservableCollection<Point> points = new ObservableCollection<Point>();
points.CollectionChanged += points_CollectionChanged;//Subscribe event
void collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
//Handle it below respectively
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
break;
case NotifyCollectionChangedAction.Remove:
break;
case NotifyCollectionChangedAction.Replace:
break;
case NotifyCollectionChangedAction.Move:
break;
case NotifyCollectionChangedAction.Reset:
break;
}
}
答案 1 :(得分:1)
您仍然可以使用ObservableCollection<Point>
:
_points = new ObservableCollection<Point>();
_points.CollectionChanged += (o, e) =>
draw_all_points_on_canvas(canvas_name, _points);
作为旁注,可以使用数据绑定将点绘制到Canvas
:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Fill="Black"
Width="1"
Height="1" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left"
Value="{Binding X}" />
<Setter Property="Canvas.Top"
Value="{Binding Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
然后使用ItemsSource = points
并vo!注意这种方式可能不如使用DrawingContext
绘图那么好,如果你有一个很多点,你应该更喜欢后者。否则这种方法有很多其他优点:
答案 2 :(得分:0)
ObservableCollection<T>
可以在此处使用,因为它定义了CollectionChanged
事件......
订阅该事件 - 当数据发生变化时会自动引发(我假设Point
是不可变的)。