Предлагаемый (простой) подход для рисования большого количества визуальных элементов в WPF? - PullRequest
2 голосов
/ 27 апреля 2010

Я пишу интерфейс с большой (~ 50000px шириной) областью типа «холст», которая используется для отображения большого количества данных довольно новым способом. Это включает в себя множество линий, прямоугольников и текста. Пользователь может прокручивать, чтобы изучить весь холст.

В данный момент я просто использую стандартную панель Canvas с различными фигурами на ней. Это удобно и просто: создайте фигуру, назначьте несколько координат и прикрепите ее к холсту. К сожалению, он довольно медленный (для создания потомков, а не для фактического рендеринга).

Я смотрел на некоторые альтернативы , это немного пугающе. Мне не нужно ничего фантастического - просто умение эффективно конструировать и размещать объекты в координатной плоскости. Если я получу только строки, цветные прямоугольники и текст, я буду счастлив.

Нужны ли Geometry экземпляры внутри Geometry Group s внутри GeometryDrawing s внутри некоторого Panel контейнера?

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

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

Фигуры довольно тяжелые. Вы, вероятно, должны изучить использование графических путей. Это гораздо эффективнее, когда пользователю не нужно взаимодействовать с отдельными частями чертежа, а иногда даже тогда.

1 голос
/ 27 апреля 2010

Старайтесь не создавать ненужные фигуры, а перерабатывайте уже имеющиеся. По сути, ни один пользователь не увидит весь экран, поэтому НЕ используйте формы, которые находятся вне поля зрения. Не создавайте новые, которых вы можете избежать - в основном, сохраняйте фигуры, выпадающие в «готовом» списке, чтобы вы могли их повторно использовать.

0 голосов
/ 27 апреля 2010

Если у вас есть большое количество экземпляров Shape, вы можете построить их асинхронно (в рабочем потоке) и поставить в очередь фактические операции Add с помощью Dispatcher. Идея заключается в том, что пользовательский интерфейс не будет сразу завершен, но пользователь может начать взаимодействовать сразу же, пока элементы продолжают загружаться.


РЕДАКТИРОВАТЬ: Выше указано неверно. WPF требует создания визуальных элементов в потоке пользовательского интерфейса. Вы все еще можете выполнить «ленивую» визуальную загрузку, используя шаблон, подобный следующему:

    private Random _random = new Random();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Thread testThread = new Thread(TestThread);
        testThread.Start();
    }

    private void TestThread()
    {
        for (int i = 0; i < 1000; i++)
        {
            Dispatcher.BeginInvoke((Action)CreateShape);
        }
    }

    private void CreateShape()
    {
        var shape = new Rectangle();
        shape.Width = _random.Next(10, 50);
        shape.Height = _random.Next(10, 50);
        shape.Fill = new SolidColorBrush(Colors.Red);
        Canvas.SetLeft(shape, _random.Next(0, 400));
        Canvas.SetTop(shape, _random.Next(0, 200));
        LayoutRoot.Children.Add(shape);            
    }

Это в основном ставит в очередь задачи, которые должны выполняться «асинхронно» в потоке пользовательского интерфейса (т. Е. Всякий раз, когда обслуживается насос сообщений), так что вы можете поддерживать отзывчивость при выполнении «длинного» обновления пользовательского интерфейса.

...