Странное поведение при изменении размера фигуры в WPF - PullRequest
0 голосов
/ 17 мая 2010

Я делаю приложение WPF, которое позволит пользователю рисовать и изменять размеры фигур. Часть изменения размера выполняется с помощью украшателей, а фигуры - мои собственные классы, полученные из Shape. Например, у меня есть Polyline, и для каждого из его пунктов я украшаю Thumb с помощью обработчика события DragDelta: </p> <pre><code> void Thumb_DragDelta(object sender, DragDeltaEventArgs e) { PolylineEx polyline = this.AdornedElement as PolylineEx; ResizingThumb thumb = sender as ResizingThumb; int index = (int)thumb.Tag; Point newPoint = new Point( polyline.Points[index].X + e.HorizontalChange, polyline.Points[index].Y + e.VerticalChange); Trace.WriteLine(String.Format("Arranging point {0}:{1},{2}", index, newPoint.X, newPoint.Y)); polyline.Points[index] = newPoint; }

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

Я также загрузил пример проекта ЗДЕСЬ , может ли кто-нибудь, кто знает свой путь по wpf, взглянуть и рассказать мне о том, что происходит?

Кроме того, если кто-то думает о лучшем способе сделать это, любая обратная связь будет высоко оценена.

Спасибо.

Редактировать: ЗДЕСЬ - это новая ссылка на файлы проекта.

1 Ответ

0 голосов
/ 18 мая 2010

Я заканчиваю тем, что отвечаю на свой вопрос :)

Я думаю, что проблема была здесь:

protected override System.Windows.Media.Geometry DefiningGeometry
{
    get
    {
        StreamGeometry geometry = new StreamGeometry();
        using (StreamGeometryContext context = geometry.Open())
        {
            context.BeginFigure(Points[0], false, true);
            foreach (Point pt in Points)
            {
                context.LineTo(pt, true, true);
            }
            geometry.Freeze();
            return geometry;
        }
    }
}

Я перешел на использование PathGeometry & LineSegments, и теперь он работает нормально.

...