#c# #wpf #.net-core-3.1
#c# #wpf #.net-core-3.1
Вопрос:
Я имею дело с очень странной проблемой в WPF, которая пока что возникает только на ОДНОМ компьютере. Рассматриваемое приложение устанавливалось сотни раз, поэтому я подозреваю, что в нем отсутствуют какие-либо зависимости, хотя это приложение для .NET Core 3.1.
Таким образом, приложение загружает изображения значков, и представление привязывается к значку через открытое свойство в ViewModel:
IconImage = new BitmapImage();
IconImage.BeginInit();
IconImage.UriSource = new Uri("LocalFilePath");
IconImage.DecodePixelWidth = 50;
IconImage.EndInit();
Где LocalFilePath — это путь к кэшированному изображению значка.
Изображение представляет собой файл PNG, его размер составляет 50×50 пикселей.
Приведенный выше код завершается ошибкой с исключением:
Message -> The image data generated an overflow during processing.
Source ->PresentationCore
Trace -> at System.Windows.Media.Imaging.ColorConvertedBitmap.FinalizeCreation()
at System.Windows.Media.Imaging.ColorConvertedBitmap..ctor(BitmapSource source, ColorContext sourceColorContext, ColorContext destinationColorContext, PixelFormat format)
at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
at System.Windows.Media.Imaging.BitmapImage.EndInit()
InnerException -> Overflow or underflow in the arithmetic operation
Что меня сбивает с толку, так это то, что это происходит только на одном компьютере, работающем под управлением Windows 10 Home Edition с последними обновлениями.
Кто-нибудь видел эту ошибку раньше?
Может ли быть лучший альтернативный способ предоставления изображений PNG для просмотра?
Комментарии:
1. Вам не нужно устанавливать свойство decode pixel width, если это действительно файл png размером 50×50.
2. Это правда, в исходном коде не было этого набора фрагментов. Я подумал, что все равно добавлю это, чтобы предотвратить какое-либо вычисление, которое приводит к переполнению. Но обе версии вызывают одно и то же исключение:
csharp IconImage = new BitmapImage("LocalFilePath");
3. UriSource не является строкой и должен быть таким: iconImage. UriSource = новый Uri (путь)
4. Спасибо, это должен был быть Uri, я соответствующим образом отредактировал вопрос
5. Содержит ли изображение встроенный цветовой профиль?
Ответ №1:
Несколько наших клиентов недавно получили такое же сообщение об ошибке. Чтобы исправить это, мы убедились, что все настройки в окне управления цветом являются «системными по умолчанию». В одном случае для «профиля устройства» было установлено значение «virtual SRGB», что вызвало эту проблему.
Это также может помочь установить IgnoreColorProfile
в BitmapImage.CreateOptions
.
Комментарии:
1. Только что был клиент, который столкнулся с описанной ошибкой, настройка
image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile
решила проблему. Спасибо!2. Спасибо! Это решило проблему, с которой столкнулся мой клиент. Если бы не этот пост, я бы все еще был в неведении.
3. Спасибо! Точно такая же проблема возникла и с одним из наших клиентов. Приложение WPF продолжило бы работу, просто не отображало бы элементы строки в некоторых окнах. Было очень запутанно пытаться устранить неполадки в том, что могло происходить.
Ответ №2:
Привязка непосредственно к свойству Uri вместо BitmapImage решила проблему. Хотя на самом деле это не исправление и не объясняет, почему исключение было сгенерировано в первую очередь, это, по крайней мере, обходной путь.
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться примером кода для этого? Я столкнулся с точно такой же проблемой здесь. Для меня похоже, что это как-то связано с последними обновлениями Windows 10 (сборка 2004)
2. Чтобы ответить самому себе, вот 2 фрагмента кода, которые я в конечном итоге использовал:
<Image Source="pack://application:,,,/MyApp;component/Assets/MyImage.png" />
дляXAML
кода иimage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/MyApp;component/Assets/MyImage.png") as ImageSource;
для кода за / viewmodels.