2011-02-04 1 views
1

У меня есть динамически сгенерированный путь, данные которого состоят из PathGeometry, состоящего из PathFigure. Этот PathFigure содержит кучу сегментов линии. Таким образом, общий путь является непрерывным, состоящим из прямых линий. Каков хороший подход, чтобы разбить этот путь на множество разных маленьких путей? Если вам интересно, причина, по которой мне нужно это сделать, - добиться эффекта «угасания пути», и, похоже, нет другого способа сделать это.Прогемически разделить путь на несколько путей

Итак, я хочу, чтобы пройти путь и разбить его на множество разных путей, а затем я установил непрозрачность первого маленького пути до 0 и последний маленький путь к 1 и интерполировать все между ними , Кроме того, я мог бы использовать это, чтобы сделать хвост пути маленьким и интерполировать до головы пути, который является большим. Существует много применений - мне нужен способ сделать это для моего приложения.

ответ

2

См. GradientPath Charles Petzold. Он реализован аналогично тому, как вы описываете, и его следует легко настроить, если вы хотите добавить поддержку для изменения ширины пути.

+0

Очень близко к тому, что я хотел! Я действительно хотел, чтобы уметь исчезать путь, но этот класс имеет проблемы, когда значения градиента прозрачны. Ну, я немного поиграю и посмотрю, смогу ли я это исправить. Благодаря! – Dalal

0

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

В Xaml:

 <Path.Stroke> 
      <LinearGradientBrush> 
       <GradientStop Color="#00000000" Offset="0.0"/> 
       <GradientStop Color="#FF000000" Offset="1.0"/> 
      </LinearGradientBrush> 
     </Path.Stroke> 

В C#:

 var brush = new LinearGradientBrush(); 
     brush.GradientStops.Add(new GradientStop(new Color { A = 0, R = 0, B = 0, G = 0 }, 0.0)); 
     brush.GradientStops.Add(new GradientStop(new Color { A = 255, R = 0, B = 0, G = 0 }, 1.0)); 
     this._path.Stroke = brush; 

Кроме того, для решения оригинальный вопрос, является ли или не выше, то, что вы ищете, у вас есть несколько варианты разделения пути. Поскольку вы знаете, что Data - это PathGeometry, состоящая из PathFigures, вы можете просто программно обращаться к сегментам и создавать больше объектов Path. Для макета, поскольку каждый из них - это новый UIElement, родитель которого должен его измерять и упорядочивать, вам нужно поместить все новые контуры в панель макета, которая будет держать их в том же относительном положении.

Я думаю, что есть несколько способов, которыми вы могли бы пойти по этому пути, но один из способов полностью позиционировать их обратно - просто выложить их на холст с помощью Canvas.Top и Canvas.Left (или .Right, .Bottom в зависимости от того, как вы их выкладываете), установите относительные смещения начала каждого сегмента в пути и отрегулируйте точки так, чтобы они были относительно нового верхнего левого угла нового Пути. Например, это

<Path Stroke="Black"> 
     <Path.Data> 
      <PathGeometry> 
       <PathFigure> 
        <LineSegment Point="10,10"/> 
        <LineSegment Point="20,60"/> 
        <LineSegment Point="70,60"/> 
       </PathFigure> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 

может стать чем-то вроде

<Path Stroke="Black"> 
     <Path.Data> 
      <PathGeometry> 
       <PathFigure> 
        <LineSegment Point="10,10"/> 
       </PathFigure> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 
    <Path Stroke="Black" Canvas.Top="10" Canvas.Left="10"> 
     <Path.Data> 
      <PathGeometry> 
       <PathFigure> 
        <LineSegment Point="10,50"/> 
       </PathFigure> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 
    <Path Stroke="Black" Canvas.Top="60" Canvas.Left="20"> 
     <Path.Data> 
      <PathGeometry> 
       <PathFigure> 
        <LineSegment Point="50,0"/> 
       </PathFigure> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 

Это должно быть ясно, как вы можете сделать это путем создания нескольких РАТНО с учетом PathGeometry объект из C#, а также, как это звучит, как вы можете не делайте этого в XAML с вашего вопроса. Дайте мне знать, если это не так, и я могу подробнее рассказать.

+0

Я согласен с ответом Криса выше. Если вы в состоянии, GradientPath в этом блоге определенно лучший способ пойти. – timmyl

+0

Спасибо за всю эту информацию. Кисть линейного градиента не будет работать, поскольку она применяет градиент, основанный на ограничивающей рамке пути, как показано на этой ссылке GradientPath. Я собираюсь попробовать GradientPath и посмотреть, как это работает. В противном случае я буду больше смотреть на то, что вы сказали о расщеплении путей. – Dalal

 Смежные вопросы

  • Нет связанных вопросов^_^