Программно разделить путь на несколько путей - PullRequest
1 голос
/ 04 февраля 2011

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

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

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

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

0 голосов
/ 04 февраля 2011

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

В 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;

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

Я думаю, что есть несколько способов сделать это, но один из способов полностью разместить их вместе, это просто выложить их на холст с их 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>

Должно быть понятно, как вы можете сделать это, сконструировав несколько объектов Path с заданным объектом PathGeometry также из C #, так как это может показаться, что вы не делаете этого в XAML из своего вопроса. Дайте мне знать, если это не так, и я могу рассказать подробнее.

...