Улучшение производительности пользовательских изображений маркеров для элементов управления диаграммами MS.

Я использую MS Chart в своем приложении WindowsForms и хочу, чтобы на диаграмме было видно много разных маркеров. В принципе это делается путем указания MarkerImage вместо Series или DataPoint. Проблема в том, что свойство MarkerImage имеет строковый тип с нет документации для его использования. Согласно образцам MS Chart, это путь к файлу изображения.

Мне удалось заставить его работать, поместив изображения в папку проекта/изображений, указав для них «Копировать в выходной каталог», а затем используя series.MarkerImage = "images/image.bmp"; в коде. В принципе это работает, но во время выполнения, когда дело доходит до первого отображения изображения маркера на графике, приложение на некоторое время зависает. Я предполагаю, что это из-за времени доступа к диску для загрузки нового файла. И это происходит каждый раз, когда на экране должно появиться новое изображение, что делает приложение действительно невосприимчивым, пока все изображения не будут кэшированы.

Я ищу какое-то решение, чтобы улучшить это. В лучшем случае я бы предпочел, чтобы все изображения хранились как встроенные ресурсы, что намного лучше, чем отправлять дополнительную папку с изображениями вместе с приложением. Согласно документация для LegendCell.Image (которые имеют аналогичное значение) строка на самом деле является URL-адресом. Я обнаружил, что можно получить URL-адрес для встроенного ресурса в приложениях ASP.NET, используя Page.ClientScript.GetWebResourceUrl, но мое приложение, если это просто WindowsForms. Можно ли получить какой-то URL-адрес встроенного ресурса в формах Windows?

Я уже думаю о реализации своих собственных потомков Series или DataPoint для обработки ссылок на ресурсы, но это не кажется правильным способом, поскольку я не вижу ничего, связанного с фактическим рендерингом Series, который я могу переопределить...

Другое решение, о котором я думаю, - это просто предварительно загрузить все файлы изображений при запуске приложения, но это похоже на взлом. А что, если я хочу предоставить маркеры вместе с отдельной сборкой (.dll)?

Обновить. Я пробовал:

  • Предварительная загрузка изображений с помощью File.ReadAllBytes. Ничего не ускоряет.
  • Использование URI данных. Сбой с исключением с текстом «Формат данного пути не поддерживается».

person Mikhail    schedule 09.12.2012    source источник
comment
Я все еще ищу решение этой проблемы.   -  person c0dehunter    schedule 02.06.2016


Ответы (1)


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

Элемент управления MSChart предлагает свойство Images, которое представляет собой набор NamedImages. Эти изображения представляют собой комбинацию уникального идентификатора и изображения, которое можно загрузить из ваших ресурсов:

  1. Если это еще не сделано, создайте файл ресурсов и добавьте его в свой проект.
  2. Добавьте изображения в этот файл в сочетании с уникальными идентификаторами (например, MyImage). Убедитесь, что для свойства Persistence изображений, которые вы хотите встроить, установлено значение «Встроено в .resx».
  3. В вашем коде определите NamedImages, которые вы добавляете в свою коллекцию Chart.Images.

    NamedImage namedImage1 = new NamedImage("Уникальный идентификатор", Resources.MyImage); Диаграмма.Изображения.Добавить(namedImage1);

Теперь вы можете использовать на диаграмме UniqueIdentifier вместо пути к значку.

Это предотвращает загрузку изображения с диска и может ускорить ваше приложение, поскольку изображение кэшируется как ресурс.

наилучшие пожелания

person Florian Grummel    schedule 23.02.2015
comment
Спасибо за ответ, но у меня нет возможности проверить, действительно ли это работает прямо сейчас. Проект, над которым я работал, слишком устарел. - person Mikhail; 26.12.2015
comment
Я не понимаю, как вы устанавливаете MarkerImage? Если я попробую с seriesWind.Points[cnt].MarkerImage = "UniqueIdentifier", он скажет, что этот ресурс уже определен. - person c0dehunter; 02.06.2016