我正在尝试创建一个可以联合多边形的程序。我想创建一个Polygon类,它可以执行一些操作,如Initialize,FindOfOrientation等。我正在使用WPF和一个抽象类 - Shape。我想继承它并使用这个类的一些属性。但是我对Property有问题:" System.Windows.Media.Geometry DefiningGeometry"我应该怎样做到这一点?
class SpecialPolygon: Shape
{
#region Constants
private const int STROKE_THIKNESS = 1; // Толщина линии
private const double OPACITY = 0.5; // Прозрачность
#endregion
int _amountOfVertexes; // Количество сторон полигона
List<Point> _listOfVertexes; // Список всех вершин
List<Stroke> _listOfStrokes; // Список ребер
PointCollection Points { get; set; }
protected override System.Windows.Media.Geometry DefiningGeometry
{
WHAT I SHOULD WRITE IN THIS CASE ???
}
/// <summary>
/// Конструктор с параметрами инициализирует полигон с заданным количеством вершин
/// </summary>
/// <param name="amountOfVertexes">Число вершин</param>
/// <param name="listOfVertexes">Список координат</param>
public SpecialPolygon(int amountOfVertexes, List<Point> listOfVertexes)
{
_amountOfVertexes = amountOfVertexes;
_listOfVertexes = listOfVertexes;
_listOfStrokes = new List<Stroke>();
this.Stroke = System.Windows.Media.Brushes.Black;
this.Fill = System.Windows.Media.Brushes.LightBlue;
this.StrokeThickness = STROKE_THIKNESS;
this.Opacity = OPACITY;
this.Points = new PointCollection();
for (int i = 0; i < _amountOfVertexes; i++)
{
Point a;
a = _listOfVertexes[i];
this.Points.Add(a);
}
// Записываем каждую пару точек в отрезок.(Точка начала отрезка и конца)
for (int i = 0; i < _amountOfVertexes - 1; i++)
{
Stroke stroke = new Stroke(_listOfVertexes[i], _listOfVertexes[i + 1]);
this._listOfStrokes.Add(stroke);
}
// Не забываем записать последний отрезок, соединяющий конец ломанной с её началом
// Таким образом получается полигон
Stroke lastStroke = new Stroke(_listOfVertexes[_amountOfVertexes - 1], _listOfVertexes[0]);
this._listOfStrokes.Add(lastStroke);
}
答案 0 :(得分:0)
我不会详细讨论已经多次写过的主题,我只会给你一个摘要和一本书的链接,这本书有一个很好的部分,可以回答你所有的问题,可能还有一些问题。你甚至都没有。正如@Clemens简洁地说, DefiningGeometry属性只会返回构成Shape 的几何。
以下有关如何创建Geometry
对象的示例取自优秀的WPF Control Development Unleashed书:
private Geometry GetArcGeometry()
{
Point startPoint = PointAtAngle(Math.Min(StartAngle, EndAngle));
Point endPoint = PointAtAngle(Math.Max(StartAngle, EndAngle));
Size arcSize = new Size(Math.Max(0, (RenderSize.Width –
StrokeThickness)/2),
Math.Max(0, (RenderSize.Height - StrokeThickness)/2));
bool isLargeArc = Math.Abs(EndAngle - StartAngle) 180;
StreamGeometry geom = new StreamGeometry();
using (StreamGeometryContext context = geom.Open())
{
context.BeginFigure(startPoint, false, false);
context.ArcTo(endPoint, arcSize, 0, isLargeArc,
SweepDirection.Counterclockwise, true, false);
}
geom.Transform = new TranslateTransform(StrokeThickness/2,
StrokeThickness/2);
return geom;
}
我建议您阅读示例:构建循环分钟计时器部分,从第40页开始,但实际上,您可能比阅读整个事情要糟糕得多。虽然我建议您为自己阅读材料,但似乎您可以阅读StackOverflow Help Center的各个页面...这将有助于您充分利用本网站