Редактировать путь программно - PullRequest
2 голосов
/ 09 февраля 2011

Можно ли редактировать путь программно?

Я пытаюсь создать userControl, который действует как горизонтальный метр, ширина которого является динамической. Я создал путь в xaml и планировал иметь свойство int, которое динамически контролирует ширину метра. У него закругленные края, поэтому я планировал отредактировать координаты x на правом конце измерителя, чтобы уменьшить его, но сохранить те же закругленные углы. Я вижу свойство Data на пути, но не понимаю, как его можно редактировать.

Возможно, есть лучший подход?

1 Ответ

4 голосов
/ 09 февраля 2011

Если вы устанавливаете Path.Data напрямую, вы не сможете редактировать его в коде позади.Если вы хотите сделать это, вы должны использовать PathGeometry вместо этого.Из MSDN

Как видно из предыдущих примеров, два мини-языка очень похожи.Всегда возможно использовать PathGeometry в любой ситуации, когда вы можете использовать StreamGeometry;так какой из них вы должны использовать?Используйте StreamGeometry, когда вам не нужно изменять путь после его создания;используйте PathGeometry, если вам нужно изменить путь.

Следующие два пути эквивалентны, более поздний можно изменить в коде

<!-- Path 1: Using StreamGeometry -->
<Path x:Name="MyPath"
      Stroke="Black"
      StrokeThickness="10"
      Margin="20"
      Data="M 10,10 L 100,10 L 100,200 L 10,200 Z"/>
<!-- Path 2: Using PathGeometry-->
<Path x:Name="MyPath2"
    Stroke="Black"
    StrokeThickness="10"
    Margin="20">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigure x:Name="figure1" StartPoint="10, 10" IsClosed="True">
                    <LineSegment x:Name="line1" Point="100, 10"/>
                    <LineSegment x:Name="line2" Point="100, 200"/>
                    <LineSegment x:Name="line3" Point="10, 200"/>
                </PathFigure>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

Чтобы изменить MyPath2 вкод позади, вы можете получить доступ к PathFigure и LineSegment s по имени

private void MovePathHorizontally()
{
    figure1.StartPoint = new Point(figure1.StartPoint.X + 10, figure1.StartPoint.Y);
    line1.Point = new Point(line1.Point.X + 10, line1.Point.Y);
    line2.Point = new Point(line2.Point.X + 10, line2.Point.Y);
    line3.Point = new Point(line3.Point.X + 10, line3.Point.Y);
}

или как это

private void MovePathHorizontally()
{
    PathGeometry pathGeometry = MyPath2.Data as PathGeometry;
    PathFigureCollection pathFigures = pathGeometry.Figures;
    foreach (PathFigure pathFigure in pathFigures)
    {
        pathFigure.StartPoint = new Point(pathFigure.StartPoint.X + 10, pathFigure.StartPoint.Y);

        PathSegmentCollection pathSegments = pathFigure.Segments;
        foreach (PathSegment pathSegment in pathSegments)
        {
            if (pathSegment is LineSegment)
            {
                LineSegment lineSegment = pathSegment as LineSegment;
                lineSegment.Point = new Point(lineSegment.Point.X + 10, lineSegment.Point.Y);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...