从App.xaml.cs访问图像时抛出异常

时间:2011-12-30 05:44:32

标签: wpf app.xaml

首先,试试这个。

<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中定义和启动,我该怎么办?

1 个答案:

答案 0 :(得分: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://尚未注册,默认值为1。

解决方案:

不要在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);
    }
}