【问题标题】:Throw exception when access image from App.xaml.cs从 App.xaml.cs 访问图像时抛出异常
【发布时间】:2011-12-30 05:44:31
【问题描述】:

首先,试试这个。

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

【问题讨论】:

    标签: wpf app.xaml


    【解决方案1】:

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

    但为什么它在MainWindow.xaml.cs 中成功而在App.xaml.cs 中失败?

    这一切都与UriParser 方案有关。 UriParser 定义了解析Uri 某些部分的方式,并参与了Uri 对象的初始化。当你的MainWindow 对象第一次被访问时,它的静态构造函数被调用并且你的图像被创建。此时,您的应用程序已经为pack:// 方案注册了一个UriParser,并且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);
        }
    }
    

    【讨论】:

    • 您的解释很有帮助。尽管如此,我不能手动加载包方案解析器吗?因为我不能在 okImage 上使用 readonly 关键字。
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2013-05-24
    • 2019-05-23
    • 2017-09-30
    • 2013-05-24
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多