1

首先,试试这个。

<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 中定义和初始化它,我该怎么办?

4

1 回答 1

2

通常TypeInitializationExceptionitemslf 不是很有帮助 - 总是检查它的InnerException属性。在您的情况下,它显示“无效的 URI:指定的端口无效。”,这更有帮助。它告诉问题不是图像本身,而是Uri引发异常的构造函数。

但是为什么它成功了MainWindow.xaml.cs又失败了App.xaml.cs呢?

这都是关于UriParser计划的。UriParser定义解析某些部分的方法,Uri并参与Uri对象初始化。当你的MainWindow对象第一次被访问时,它的静态构造函数被调用并创建你的图像。此时,您的应用程序已经注册了一个UriParserforpack://方案,并且Uri解析器成功。但是当你尝试在 中做同样的事情时Application.xaml.cs,自定义UriParserpack://方案还没有注册,默认一个失败。

解决方案:

不要在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);
    }
}
于 2011-12-30T06:32:26.497 回答