2017-02-15 4 views
0

У меня есть List<Point>, содержащий около 500 баллов. Эти точки должны быть нарисованы как путь. Но время от времени мне нужно переключиться в режим «Только точки», который показывает не непрерывную линию, а только точки, на которых основана моя линия.Простой способ нарисовать список точек (вместо пути)

Если найдено простое решение, используя ItemsControl что не очень производительный:

<ItemsControl ItemsSource="{Binding Line}"> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="FrameworkElement"> 
      <Setter Property="Canvas.Left" Value="{Binding X}" /> 
      <Setter Property="Canvas.Top" Value="{Binding Y}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="Point"> 
       <Ellipse Fill="GreenYellow" Width="2" Height="2" Margin="-1,-1,1,1"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

При рисовании своей линии, используя Path -объект, производительность намного лучше (но это непрерывный путь, а не одиночные точки):

<Path Data="{Binding Path=Line, Converter={StaticResource ResourceKey=PointsToPath}}" 
     Stroke="GreenYellow" 
     StrokeThickness="2"/> 

есть ли способ, чтобы достичь того же (или, по меньшей мере, аналогичный) производительность при просто рисунок точки моей линии? Нарисованная точка не должна быть в определенной форме или размере на данный момент ...

Если вы нашли этот вопрос: Most performant way to graph thousands of data points with WPF?, но там они говорят о до 100 000 пунктов - я надеюсь найти более простой способ , так как я имею дело с намного меньшим количеством очков в моем случае.

мне нужно, чтобы эти точки обращаются в интерактивном режиме как можно более гладко, по меньшей мере 15 FPS

+0

разрешен разрешающая способность? –

+0

Есть слишком много возможностей, особенно учитывая отсутствие [mcve], показывающее, что вы уже пробовали. Вопрос, который вы нашли, фактически включает в себя ряд опций; вы хотите «более простой способ», но по сравнению с теми, кто отвечает за несколько ответов? Некоторые мне кажутся не такими уж плохими. Другие варианты включают использование «DrawingVisual», либо рендеринг непосредственно в контексте объекта, либо создание для него собственного «Drawing». Уточните и улучшите вопрос. –

+0

Я просто попробовал, и даже если у меня есть 50000, есть только задержка, когда они загружаются. После рисования все становится гладким. Если вы не загружаете новые очки каждую секунду, я думаю, что замедление происходит в другом месте. –

ответ

1

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

EDIT:

Хорошо, теперь, когда вы добавили, что это должно быть обновлено в 15fps, а не один раз ничей, я хотел бы повторить комментарии Mike и будет обходить привязку и просто иметь управление холстом. Вы будете «загружать» детей один раз со всеми прямоугольниками, а затем использовать цикл таймера через детей X раз в секунду и напрямую изменять свойства canvas.left и canvas.top.

+0

Изменение «Эллипса» на «Прямоугольник» действительно улучшает производительность, но немного. На обратной стороне эллипсы выглядят более гладкими, даже в этом маленьком масштабе. – DIF