Я создаю Path
в Silverlight и добавляю в него элементы при событиях мыши. Но, хотя элементы находятся в памяти, экран не обновляется, пока что-то еще не вызовет перерисовку экрана.
Вот соответствующий код - я отвечаю на событие мыши и сохраняю член класса пути, который я редактирую.
Path path = null;
private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point thisPoint = e.GetPosition(LayoutRoot);
if (path == null)
{
CreateNewPath(thisPoint);
path.LayoutUpdated += new EventHandler(path_LayoutUpdated);
}
else
{
path.AddLineElement(thisPoint);
}
}
private void CreateNewPath(Point startPoint)
{
path = new Path();
PathGeometry geometry = new PathGeometry();
path.Data = geometry;
PathFigureCollection figures = new PathFigureCollection();
geometry.Figures = figures;
PathFigure figure = new PathFigure();
figures.Add(figure);
figure.StartPoint = startPoint;
figure.Segments = new PathSegmentCollection();
path.Stroke = new SolidColorBrush(Colors.Red);
path.StrokeThickness = 2;
path.Stretch = Stretch.None;
LayoutRoot.Children.Add(path);
}
AddLineElement
- это метод расширения для класса пути, просто для упрощения:
public static class PathHelper
{
public static void AddLineElement(this Path thePath, Point newPoint)
{
PathGeometry geometry = thePath.Data as PathGeometry;
geometry.Figures[0].Segments.Add(new LineSegment { Point = newPoint });
}
}
Это минимум, необходимый для воспроизведения проблемы. Если вы запустите этот код в полном приложении WPF, то все будет работать как положено. Щелчки мыши добавляют линейные элементы, которые появляются сразу. Однако в Silverlight дело обстоит иначе. Кажется, что щелчки ничего не делают, хотя пошаговое выполнение кода показывает, что данные добавляются. Но если вы нажмете несколько раз, то измените размер браузера, например, появятся элементы пути. Если у вас также есть кнопка на странице и наведен указатель мыши, появится путь.
Я перепробовал все очевидные вещи, например, вызов InvalidateMeasure
и InvalidateArrange
на Path
(и на родительской сетке) безрезультатно.
Единственный обходной путь, который у меня есть, - это изменить свойство пути, а затем изменить его обратно, чего, по-видимому, достаточно, чтобы механизм рендеринга нарисовал новые элементы пути. Я использую Opacity
. Вы должны установить другое значение, иначе (я полагаю) событие PropertyChanged
не сработает. Хотя это клудж.
Кто-нибудь еще играл с путями таким образом? Думаю, если бы я одновременно выводил на экран другие графические элементы, это не было бы проблемой, так что, вероятно, это не что-то, что могло бы повлиять на людей, но было бы хорошо знать, если есть более правильный способ сделать это .