[WPF] Об одной ошибке в WPF, связанной с печатью в XPS
От: aloch Россия  
Дата: 29.03.11 06:14
Оценка: 35 (6)
Периодически, при сохранении довольно сложной геометрии (полученной из автокадовского DWFx файла) в XPS файл (через XpsDocumentWriter.Write(Visual)), при попытке в дальнейшем прочитать этот XPS я получал следующее исключение:

Не удается преобразовать строку "M4165.614157,2418.929134A376,376 -90,0000025044782 1 1 4165.61514309928,3170.929134M4165.614157,2418.929134A376,376 -90,0000025044782 0 0 4165.61514309928,3170.929134M3774.61415549928,4609.929134A411,411 -90,0000025044782 1 1 3774.61523338972,5431.929134M3774.61415549928,4609.929134A411,411 -90,0000025044782 0 0 3774.61523338972,5431.929134M6187.61414938972,4297.929134A553,553 -90,0000025044782 1 1 6187.61559968999,5403.929134M6187.61414938972,4297.929134A553,553 -90,0000025044782 0 0 6187.61559968999,5403.929134M8583.61413868999,2771.929134A805,806 -90,0000025044782 1 1 8583.61625242177,4381.929134M8583.61413868999,2771.929134A805,806 -90,0000025044782 0 0 8583.61625242177,4381.929134M9433.61413712177,5963.929134A841,841 -90,0000025044782 1 1 9433.61634273213,7645.929134M9433.61413712177,5963.929134A841,841 -90,0000025044782 0 0 9433.61634273213,7645.929134M4624.61413073213,6325.929134A989,989 -90,0000025044782 1 1 4624.61672448795,8303.929134M4624.61413073213,6325.929134A989,989 -90,0000025044782 0 0 4624.61672448795,8303.929134" в атрибуте "Data" в объект типа "System.Windows.Media.Geometry". Недопустимая лексема ...


Но это происходило далеко не всегда. Т.е. для большинства DWFx все работало хорошо, но с некоторыми файлами возникали проблемы.

Ошибка повторялась на .Net FW 3, 3.5, 4. И вот, я, наконец, нашел, в чем была проблема. Я стал разбираться в строке Data, и мое внимание привлекло странное число 0000025044782, и тут я понял, что число это, на самом деле, -90,0000025044782! Т.е. в каком-то месте ReachFramework.dll при преобразовании Double в String используется не InvariantCulture, а текущая культура (в моем случае – русская), и вместо '.' используется ','! Это именно какой-то особый случай, т.к. даже в данном примере видно, что большинство чисел представлено в правильном формате.

Добавление в код строки:

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

Перед вызовом XpsDocumentWriter.Write(Visual) полностью устранило проблему, и на выходе стало получаться ‘-90.0000025044782’.


Re: [WPF] Об одной ошибке в WPF, связанной с печатью в XPS
От: aloch Россия  
Дата: 30.03.11 19:08
Оценка:
Изучение этой ошибки показало, что InvariantCulture следует выставлять не только перед созданием XPS файла, но и перед дальнейшим его выводом на печать (и через XpsDocumentWriter.Write(), когда XpsDocumentWriter создан для PrintQueue, и даже перед PrintDialog.PrintVisual()). В противном случае при выводе на востренный в Windows виртуальный принтер ~Microsoft XPS Document Writer~ получается опять «кривой» XPS с -90,...

Но на другие принтеры вывод работает нормально...


 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.