Обычно TypeInitializationException
сам по себе не очень полезен - всегда проверяйте его свойство InnerException
.В вашем случае он говорит «Неверный URI: указан неверный порт», что гораздо полезнее.Это говорит о том, что проблема не в самом изображении, а в Uri
конструкторе, который выдает исключение.
Но почему он преуспевает в MainWindow.xaml.cs
и терпит неудачу в App.xaml.cs
?
Это все оUriParser
схем.UriParser
определяет способ синтаксического анализа некоторых частей Uri
и участвует в Uri
инициализации объекта.Когда к вашему MainWindow
объекту обращаются в первый раз, вызывается его статический конструктор и создается ваше изображение.На данный момент ваше приложение уже зарегистрировало схему UriParser
для pack://
, и анализатор Uri
успешно выполняется.Но когда вы пытаетесь сделать то же самое в Application.xaml.cs
, пользовательская UriParser
для pack://
схема еще не зарегистрирована, и по умолчанию она не выполняется.
Решение:
Не создавать экземплярваши изображения в Application
статический конструктор.Вы можете по-прежнему сохранять поля или свойства и делать их статичными, если хотите, но переместите весь код инициализации своего изображения в OnStartup()
:
public partial class App : Application
{
public static BitmapImage okImage;
protected override void OnStartup(StartupEventArgs e)
{
okImage = new BitmapImage(new Uri("pack://application:,,,/ok.png"));
base.OnStartup(e);
}
}