2011-12-30 1 views
1

Сначала попробуйте это.Выбросить исключение при образе доступа из App.xaml.cs

<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, как мне это сделать?

ответ

2

Обычно TypeInitializationException iteslf не очень помогает - всегда проверяйте его 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); 
    } 
} 
+0

Ваших объяснений полезно. Тем не менее, я не могу вручную загрузить парсер пакетов пакетов? Потому что я не могу использовать ключевое слово readonly для okImage. – Gqqnbig