Выдает исключение при доступе к изображению из App.xaml.cs - PullRequest
1 голос
/ 30 декабря 2011

Сначала попробуйте это.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="80" Width="100" Loaded="Window_Loaded">
    <Image x:Name="image"/>
</Window>

и

public partial class MainWindow : Window
{
    public static  BitmapImage okImage = new BitmapImage(new Uri("pack://Application:,,,/ok.png"));

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        image.Source = okImage;
    }
}

ПОМНИТЕ поместить любое изображение с именем ok.png в каталог проекта. Это хорошо работает и показывает изображение в окне.

Теперь попробуйте переместить public static BitmapImage okImage = new BitmapImage(new Uri("pack://Application:,,,/ok.png")); в App.xaml.cs.

Запустите снова, мы получим исключение TypeInitializationException. Почему?

Я знаю, что могу определить okImage в MainWindow.xaml.cs, но если я настаиваю, чтобы он был определен и инициализирован в App.xaml.cs, как мне это сделать?

1 Ответ

2 голосов
/ 30 декабря 2011

Обычно 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);
    }
}
...