更改多边形的点数 [英] Changing a Polygon's Points
问题描述
SOLUTION
动态保证金
所以我试图让我的多边形移动的窗口移动。我有;
So I'm trying to get my polygon to move as the window is moved. I have;
private void ResetPolygon(Point Point1, Point Point2, Point Point3)
{
SpeechPoly.Points.Clear();
ObservableCollection<Point> myPointCollection = new ObservableCollection<Point>();
myPointCollection.Add(Point3);
myPointCollection.Add(Point2);
myPointCollection.Add(Point1);
foreach (Point p in myPointCollection)
{
SpeechPoly.Points.Add(p);
}
}
private void Window_LocationChanged(object sender, EventArgs e)
{
if (this.IsLoaded)
{
Point Point1 = new Point(newPoint3);
Point Point2 = new Point(newPoint2);
Point Point3 = new Point(newPoint1);
ResetPolygon(newPoint1, newPoint2, newPoint3);
//Write out the values of both the list and the polygon to screen!
txtBlock.Text = newPoint1.X.ToString("N2") + ", " + newPoint1.Y.ToString("N2") +
"\n" + newPoint2.X.ToString("N2") + ", " + newPoint2.Y.ToString("N2") + "\n" +
newPoint3.X.ToString("N2") + ", " + newPoint3.Y.ToString("N2");
txtBlock.Text += "\n" + SpeechPoly.Points[0].X.ToString("N2") + ", " +
SpeechPoly.Points[0].Y.ToString("N2") + "\n" + SpeechPoly.Points[1].X.ToString("N2") + ", " +
SpeechPoly.Points[1].Y.ToString("N2") + "\n" + SpeechPoly.Points[2].X.ToString("N2") + ", "+
SpeechPoly.Points[2].Y.ToString("N2");
}
}
但多边形保持同样的形状,无论怎样,即使文本块
清楚地显示在列出所有
和分数
的值多边形
的点肯定是不断变化的。
But the Polygon remains the same shape no matter what, even though the Textblock
clearly shows the values of all the Points
in the List
and the Polygon
's points are definitely changing.
我也尝试绑定分数
的多边形
我的代码的属性。
I've also tried to bind the Points
property of the Polygon
to my code.
<Polygon
Name="SpeechPoly"
Points="{Binding myPointCollection, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
Stroke="Black"
StrokeThickness="2"
</Polygon>
我用以前也尝试了 pointsCollection
相列表<积分和GT;
,但同样的结果。似乎像在多边形
不清爽。
I've also tried using a pointsCollection
as opposed List<Points>
but same result. Almost seems like the Polygon
is not refreshing.
推荐答案
我是不是被满意以前的答案我给,因为它毕竟是一个解决办法。
I was not being satisfied with the previous answer I gave as it is after all a workaround..
我找到了一个更好的解决方案,这将不需要重置databinds的问题。
I found a better solution to the problem which will not require to reset the databinds.
因此,从XAML结合被引导到一个属性与INCC但是数据本身被转换为点绘制时使用的多边形
So the binding from XAML is being directed to a property with INCC however the data itself is converted to Points for the polygon to use when drawing.
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication9"
Title="MainWindow" Height="350" Width="525" LocationChanged="Window_LocationChanged" >
<Window.Resources>
<local:MyPointCollectionConverter x:Key="mcolconv" />
</Window.Resources>
<Canvas>
<Polygon Name="SpeechPoly" Stroke="Black" StrokeThickness="2"
Points="{Binding Path=myPointCollection, Converter={StaticResource mcolconv}}" />
</Canvas>
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;
namespace WpfApplication9
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Point> _myPointCollection = new ObservableCollection<Point>();
public ObservableCollection<Point> myPointCollection { get { return _myPointCollection; } }
public MainWindow()
{
myPointCollection.Add(new Point(100, 50));
myPointCollection.Add(new Point(150, 100));
myPointCollection.Add(new Point(50, 100));
InitializeComponent();
DataContext = this;
}
private void ResetPolygon(Point Point1, Point Point2, Point Point3)
{
myPointCollection.Clear();
myPointCollection.Add(Point1);
myPointCollection.Add(Point2);
myPointCollection.Add(Point3);
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("myPointCollection"));
}
private void Window_LocationChanged(object sender, EventArgs e)
{
if (this.IsLoaded)
{
Random rnd = new Random();
Point Point1 = new Point(rnd.Next(50, 200), rnd.Next(50, 200));
Point Point2 = new Point(rnd.Next(50, 200), rnd.Next(50, 200));
Point Point3 = new Point(rnd.Next(50, 200), rnd.Next(50, 200));
ResetPolygon(Point1, Point2, Point3);
}
}
}
public class MyPointCollectionConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var regPtsColl = new PointCollection(); //regular points collection.
var obsPtsColl = (ObservableCollection<Point>)value; //observable which is used to raise INCC event.
foreach (var point in obsPtsColl)
regPtsColl.Add(point);
return regPtsColl;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
#endregion
}
}
这篇关于更改多边形的点数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!