Как создать CombinedGeometry для эллипса и линии - PullRequest
0 голосов
/ 28 августа 2018

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

Color grey = Color.FromArgb(128, Colors.Gray.R, Colors.Gray.G, Colors.Gray.B);
double radius = Math.Min(ActualWidth, ActualHeight) / 2;
Brush ellipse_brush = new SolidColorBrush(grey);

CombinedGeometry cg = new CombinedGeometry();

Drawing maskDrawing = new GeometryDrawing(Brushes.Lime, null, cg);
DrawingBrush mask = new DrawingBrush(maskDrawing);

dc.PushOpacityMask(mask);
dc.DrawEllipse(ellipse_brush, new Pen(ellipse_brush, 0), new Point(radius, radius), radius, radius);
dc.Pop();

Дело в том, что я не понимаю, как создать CombinedGeometry для эллипса и двух линий. А может я на неверном пути?

1 Ответ

0 голосов
/ 30 августа 2018

Вам не нужна маска непрозрачности в сочетании с CombinedGeometry.

Создайте геометрию перекрестного контура из GeometryGroup с двумя линиями и соответствующим пером, затем объедините ее Xor с EllipseGeometry и нарисуйте результат:

var radius = Math.Min(ActualWidth, ActualHeight) / 2;
var crossSize = 0.8 * radius;
var crossThickness = 0.3 * radius;
var centerPoint = new Point(radius, radius);
var ellipseGeometry = new EllipseGeometry(centerPoint, radius, radius);
var crossGeometry = new GeometryGroup();

crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y - crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y + crossSize / 2)));
crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y + crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y - crossSize / 2)));

var crossPen = new Pen
{
    Thickness = crossThickness,
    StartLineCap = PenLineCap.Round,
    EndLineCap = PenLineCap.Round
};

var crossOutlineGeometry = crossGeometry.GetWidenedPathGeometry(crossPen);
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Xor,
                                            ellipseGeometry, crossOutlineGeometry);

dc.DrawGeometry(Brushes.Gray, null, combinedGeometry);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...