Заполненные дуги в WPF - PullRequest
5 голосов
/ 23 мая 2011

Я пытаюсь нарисовать фигуру примерно так: Concentric arcs

Мне нужен уникальный элемент для каждого сегмента дуги, на котором я могу обрабатывать события и перекрашивать их по мере необходимости. Я немного не уверен, как создать правильную геометрию в WPF. Я могу легко рассчитать четыре точки для каждого сегмента дуги из радиуса окружностей и угла от центра. Используя радиус 100 для внешнего круга и 50 для внутреннего, четыре точки красного цвета (по часовой стрелке от верхнего левого угла с началом в верхней части круга):

0,0
70,30
35,65
0,50

Используя эти точки, я создаю простой путь для рисования сегмента:

<Path Stroke="Black" Fill="Black" StrokeThickness="1" >
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigure StartPoint="0,0">
          <PathFigure.Segments>
            <ArcSegment Point="70,30" />
            <LineSegment Point="35,65" />
            <ArcSegment Point="0,50" />
          </PathFigure.Segments>
        </PathFigure>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

Но это просто рисует трапецию с прямыми линиями. Я знаю, что могу изменить размер на ArcSegments, но я не могу понять, как это влияет на кривизну. Я хочу, чтобы дуги следовали за основным кругом, но я не уверен, как это выразить. Как я могу сделать дуги правильной кривизны?

Кроме того, как я могу выразить и добавить пути в коде c #, а не в xaml?

Ответы [ 2 ]

5 голосов
/ 23 мая 2011

Я нарисовал именно такую ​​форму (две коаксиальные дуги и две радиальные, соединяющие их), вот так:

new LineSegment(new Point(x2, y2), true),
new ArcSegment(new Point(x3,y3),new Size(100*outerRadius,100*outerRadius), 0,largeAngle, SweepDirection.Clockwise, true),
new LineSegment(new Point(x4, y4), true),
new ArcSegment(new Point(x1, y1),new Size(100*innerRadius,100*innerRadius), 0,largeAngle, SweepDirection.Counterclockwise, true),

Очевидно, что это код, а не XAML, но он может дать вам толчок.

0 голосов
/ 28 мая 2015

Еще одним вариантом может быть включение пространства имен чертежа выражения 2010 в XAML. Тогда это легко.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Class="Arcs.MainWindow"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ed:Arc ArcThickness="30"
            ArcThicknessUnit="Pixel"
            StartAngle="30"
            EndAngle="130"
            HorizontalAlignment="Left"
            Height="179" Margin="195,62,0,0"
            Stretch="None"
            Stroke="CornflowerBlue"
            Fill ="CornflowerBlue"
            VerticalAlignment="Top"
            Width="179" />
</Grid>

РЕДАКТИРОВАТЬ: Это будет тянуть "Microsoft.Expression.Drawing", который устанавливается при установке Blend. Если на клиентском компьютере этого нет, произойдет сбой. С другой стороны, вы можете упаковать и распространить DLL с вашим программным обеспечением. Microsoft позволяет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...