Рисование тысяч прямоугольников в WPF
Мне нужно нарисовать много прямоугольников (~50000). В настоящее время я использую следующий подход.
<ItemsControl ItemsSource="{Binding Elements}" IsHitTestVisible="False" Background="Transparent">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True"
Background="Transparent"
Width="500"
Height="500">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Bottom" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type models:Element}">
<Rectangle Width = "{Binding Width}"
Height = "{Binding Height}"
Fill= "{Binding Brush}"
SnapsToDevicePixels="True" >
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Проблема в том, что рисование такого количества прямоугольников занимает очень много времени. Есть ли лучший способ рисовать большое количество фигур?
1 ответ
Wpf имеет довольно неэффективный движок рендеринга, и 50000 форм - это слишком много для него, даже без накладных расходов.
Кратко рассмотрим этот документ: система рендеринга WPF
Вместо этого рассмотрите возможность использования API рисования, такого как Direct2D, который сравнительно хорошо доступен из WPF: Direct2D с WPF