Вложенные пути WPF - PullRequest
       1

Вложенные пути WPF

2 голосов
/ 08 июля 2010

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

Я пытаюсь заставить работать две функции:
1. Элемент управления должен изменить размер Venn, чтобы заполнить доступное пространство.
2. Каждая секция Венна должна принимать мышью, а также иметь разные цвета.

Я могу сделать и то и другое, но не одновременно ...

На данный момент мой код выглядит так:

<Grid>  
<Path Stretch="Uniform" Fill="Blue" >
  <Path.Data>
    <GeometryGroup>
      <CombinedGeometry GeometryCombineMode="Exclude" >
        <CombinedGeometry.Geometry1>
          <EllipseGeometry Center="-25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry1>
        <CombinedGeometry.Geometry2>
          <EllipseGeometry Center="25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry2>
      </CombinedGeometry>
      <CombinedGeometry GeometryCombineMode="Exclude" >
        <CombinedGeometry.Geometry1>
          <EllipseGeometry Center="25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry1>
        <CombinedGeometry.Geometry2>
          <EllipseGeometry Center="-25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry2>
      </CombinedGeometry>
      <CombinedGeometry GeometryCombineMode="Intersect">
        <CombinedGeometry.Geometry1>
          <EllipseGeometry Center="-25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry1>
        <CombinedGeometry.Geometry2>
          <EllipseGeometry Center="25, 0" RadiusX="50" RadiusY="50"/>
        </CombinedGeometry.Geometry2>
      </CombinedGeometry>
    </GeometryGroup>
  </Path.Data>
</Path>

Как вы можете видеть, я использую объекты Geometry для своих секций Venn, но я хочу иметь объекты Path, чтобы я мог поддерживать взаимодействие и стили. Это возможно? Есть ли лучший способ сделать это?

Спасибо!

1 Ответ

3 голосов
/ 09 июля 2010

Если вы используете каждый из ваших объектов CombinedGeometry в качестве данных для отдельного пути, вы можете получить различные взаимодействия и цвета.Для правильного изменения размера вы можете поместить Grid в ViewBox вместо установки Stretch на пути.Это не сместит начало координат, поэтому вы захотите сместить эллипсы по центру (50,50) и (100,50).

<Viewbox>
    <Grid>
        <Path Fill="Blue">
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Exclude">
                    <CombinedGeometry.Geometry1>
                        <EllipseGeometry Center="50, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <EllipseGeometry Center="100, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
        <Path Fill="Red">
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Exclude" >
                    <CombinedGeometry.Geometry1>
                        <EllipseGeometry Center="100, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <EllipseGeometry Center="50, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
        <Path Fill="Purple">
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Intersect">
                    <CombinedGeometry.Geometry1>
                        <EllipseGeometry Center="50, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <EllipseGeometry Center="100, 50" RadiusX="50" RadiusY="50"/>
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
    </Grid>
</Viewbox>
...