Эллипс с отверстием

#wpf #xaml #wpf-controls

#wpf #xaml #wpf-элементы управления

Вопрос:

Как я могу создать эллипс (путь, …) с отверстием в нем:

Эллипс с отверстием

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

Ответ №1:

=>

     <Path Stroke="Red" StrokeThickness="20">
        <Path.Data>
            <PathGeometry>
                <PathFigure StartPoint="80,0">
                    <ArcSegment x:Name="ArcSeg1" Size="100,100" RotationAngle="0" IsLargeArc="True" 
                SweepDirection="Clockwise" Point="20,0"  >
                    </ArcSegment>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
  

Здесь есть несколько соответствующих свойств, чтобы понять математику, стоящую за этим, смотрите
http://www.charlespetzold.com/blog/2008/01/Mathematics-of-ArcSegment.html
Но в основном вы даете координаты пересечения двух эллипсов :пересечение

Начальная точка и Point представляют точки пересечения, а Size — размер полного эллипса. Остальное говорит само за себя. Если вы хотите повернуть его, самым простым и оптимальным способом было бы использовать RotateTransform .

Ответ №2:

Поможет ли создание «отверстия» в виде белого треугольника поверх полного круга? Это может быть повернуто вокруг центра круга в сочетании с «указателем» (линией).

Я могу только извиниться за мой грубый рендеринг

Комментарии:

1. Я не знаю. Вот почему я спрашиваю. 😉

Ответ №3:

Вы можете использовать комбинированную геометрию с GeometryCombineMode="Exclude"

В документации есть хороший пример. пример комбинированной геометрии

Комментарии:

1. Насколько я понял CombinedGeometry, второй эллипс также виден, потому что видимостью управляет окружающий контур, а не два объединенных геометрических объекта.

2. это неправда. GeometryCombineMode=’Exclude’ делает именно то, что он говорит, а CombinedGeometry — это «новая» геометрия, вычисленная на основе входных данных. Я действительно думаю, что это гораздо более гибкий подход, чем вычисление ArcSegment вручную.