Рисование в WPF с помощью DrawingVisual
Код:
....
<Grid Width="60" Height="60">
<local:MyField/>
</Grid>
<Grid Width="60" Height="60">
<local:MyField/>
</Grid>
Код:
var visual = new DrawingVisual();
children.Add(visual);
using (var dc = visual.RenderOpen())
{
dc.DrawLine(new Pen(Brushes.Black, 1), new Point(0, 0), new Point(400, 400));
dc.DrawLine(new Pen(Brushes.Black, 1), new Point(0, 400), new Point(400, 0));
}
children.Add(visual);
using (var dc = visual.RenderOpen())
{
dc.DrawLine(new Pen(Brushes.Black, 1), new Point(0, 0), new Point(400, 400));
dc.DrawLine(new Pen(Brushes.Black, 1), new Point(0, 400), new Point(400, 0));
}
"Точек много" - это что значит?
Зачем пытаться рисовать больше, чем экран может отобразить?
Я разделил - точная модель (где много точек) - отдельно, а перед отображением она пересчитывается в масштаб экрана (и это, даже на современном мониторе, ну 2000 х 1000) и точек остается мало. И даже винформы не тормозили.
У меня тормоза очень заметно проявляются уже на 10 линиях по 1000 точек на каждую (на Core i3 с 3 ГБ ОЗУ). Пусть обычно и не нужно одновременно просматривать 10 графиков, но при большом разрешении точек будет больше на каждый график.
Сами подумайте - не могут 10 линий грузить современный 3д акселератор. Это же не ZX - Spectrum 48. :-)
А я и на нем больше (300) линий рисовал.
Просто хочу сказать, что попытка не использовать линии (по определению оптимизированные и отлаженные) и замена их своим аналогом - проблему не решит.
Код:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded +=new RoutedEventHandler(MainWindow_Loaded);
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Polyline[] lines = new Polyline[10];
for (int i = 0; i < lines.Length; ++i)
{
lines[i] = new Polyline();
lines[i].StrokeThickness = 1;
lines[i].Stroke = new SolidColorBrush(Colors.Blue);
PointCollection pc = new PointCollection();
Random rand = new Random();
for (int j = 0; j < 1000; ++j)
{
int x = rand.Next(1200);
int y = rand.Next(800);
Point point = new Point(x, y);
pc.Add(point);
}
lines[i].Points = pc;
this.grid1.Children.Add(lines[i]); //grid1 - описан в xaml как контейнер главного окна
}
}
{
public MainWindow()
{
InitializeComponent();
this.Loaded +=new RoutedEventHandler(MainWindow_Loaded);
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Polyline[] lines = new Polyline[10];
for (int i = 0; i < lines.Length; ++i)
{
lines[i] = new Polyline();
lines[i].StrokeThickness = 1;
lines[i].Stroke = new SolidColorBrush(Colors.Blue);
PointCollection pc = new PointCollection();
Random rand = new Random();
for (int j = 0; j < 1000; ++j)
{
int x = rand.Next(1200);
int y = rand.Next(800);
Point point = new Point(x, y);
pc.Add(point);
}
lines[i].Points = pc;
this.grid1.Children.Add(lines[i]); //grid1 - описан в xaml как контейнер главного окна
}
}
И еще полезная ссылка об этом: [url]http://blogs.msdn.com/b/dsimmons/archive/2010/11/28/simple-wpf-2d-graphics-drawingvisual.aspx
и рисуйте на нем.
Вам ведь функциональность Polyline не нужна - а систему она грузит.
Чинил я как-то програмку, в которой контролы (кнопочки, меточки, комбобоксы) добавлялись динамически, из базы данных.
И программка падала, потому, что количество контролов в приложении - ограничено системой, и в зависимости от компьютера - от 1500 до 2500 штук.
Думаю, что тут вы тоже к границе подошли.
и рисуйте на нем.
Вам ведь функциональность Polyline не нужна - а систему она грузит.[/QUOTE]
А поподробнее? Что за PictureBox? Кроме DrawingVisual и обычного Canvas ничего не нашел. И чем можно заменить Polyline?
Код:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Polyline[] lines = new Polyline[10];
for (int i = 0; i < lines.Length; ++i)
{
lines[i] = new Polyline();
lines[i].StrokeThickness = 1;
lines[i].Stroke = new SolidColorBrush(Colors.Blue);
PointCollection pc = new PointCollection();
Random rand = new Random();
for (int j = 0; j < 1000; ++j)
{
int x = rand.Next(1200);
int y = rand.Next(800);
Point point = new Point(x, y);
pc.Add(point);
}
lines[i].Points = pc;
this.Grid1.Children.Add(lines[i]); //grid1 - описан в xaml как контейнер главного окна
this.Grid1.SizeChanged += new SizeChangedEventHandler(Grid1_SizeChanged);
}
Thread.Sleep(1000);
}
Image image1;
void Grid1_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (image1 == null)
{
RenderTargetBitmap bitmap = new RenderTargetBitmap(400, 300, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(this.Grid1);
image1 = new Image();
image1.Source = bitmap;
this.Grid1.Children.Clear();
this.Grid1.Children.Add(image1);
}
}
}
}
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Polyline[] lines = new Polyline[10];
for (int i = 0; i < lines.Length; ++i)
{
lines[i] = new Polyline();
lines[i].StrokeThickness = 1;
lines[i].Stroke = new SolidColorBrush(Colors.Blue);
PointCollection pc = new PointCollection();
Random rand = new Random();
for (int j = 0; j < 1000; ++j)
{
int x = rand.Next(1200);
int y = rand.Next(800);
Point point = new Point(x, y);
pc.Add(point);
}
lines[i].Points = pc;
this.Grid1.Children.Add(lines[i]); //grid1 - описан в xaml как контейнер главного окна
this.Grid1.SizeChanged += new SizeChangedEventHandler(Grid1_SizeChanged);
}
Thread.Sleep(1000);
}
Image image1;
void Grid1_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (image1 == null)
{
RenderTargetBitmap bitmap = new RenderTargetBitmap(400, 300, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(this.Grid1);
image1 = new Image();
image1.Source = bitmap;
this.Grid1.Children.Clear();
this.Grid1.Children.Add(image1);
}
}
}
}