2011-12-30 5 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が発生します。どうして?

私はMainWindow.xaml.csでokImageを定義できますが、App.xaml.csで定義して初期化する必要があると主張する場合、どうすればよいですか?

答えて

2

通常TypeInitializationException iteslfはあまり役に立ちません。常にInnerExceptionのプロパティを確認してください。 あなたのケースでは、 "無効なURI:無効なポートが指定されました"と表示されます。これははるかに役立ちます。 問題は画像そのものではなく、Uriの例外をスローするコンストラクタです。

しかし、なぜそれがMainWindow.xaml.csで成功し、App.xaml.csに失敗するのですか?

これはすべて約UriParserです。 UriParserUriの一部を解析する方法を定義しており、Uriオブジェクトの初期化に関与しています。最初にMainWindowオブジェクトにアクセスすると、静的コンストラクターが呼び出され、イメージが作成されます。現時点では、pack://スキームの場合はUriParser、パーサーは成功した場合はUriが登録されています。しかし、Application.xaml.csで同じことをしようとすると、 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

あなたのexplainationが便利です。手動でパックスキーマパーサーを読み込むことはできませんか?なぜなら私はokImageでreadonlyキーワードを使うことができないからです。 – Gqqnbig

関連する問題