首先,试试这个。
<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中定义和启动,我该怎么办?
答案 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);
}
}