我今天花了太长时间试图弄清楚为什么我的WPF应用程序似乎花了这么长时间来加载以前加载得更快的窗口。事实证明,问题的原因是图像控制带有无效的源uri(无论出于何种原因,我们都没有注意到图像没有被渲染)。
虽然实际代码涉及的范围更广,(图片跨越了许多dll),我可以轻松地重现下面的问题。
public partial class MainWindow : Window
{
public List<object> Items { get; private set; }
public MainWindow()
{
Items = Enumerable.Repeat(new object(), 250).ToList();
DataContext = this;
InitializeComponent();
}
}
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Source="icon.png" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
当您使用不存在的内容替换源代码时,在应用程序启动之前,您获得的所有内容都是非常长的延迟,而不是在输出窗口中获得异常。显然,在这个简单的例子中,很容易看出错误,但在大型项目中却不是这样。
我不想再次被这个抓住,无论如何都要抓住这些错误?为什么我在调试版本的输出窗口中没有看到任何内容?
编辑:事实证明我可以做这样的事情
public partial class App : Application
{
public App()
{
EventManager.RegisterClassHandler(typeof(Image), Image.ImageFailedEvent,
new EventHandler<ExceptionRoutedEventArgs>(OnImageFailed));
}
void OnImageFailed(object sender, ExceptionRoutedEventArgs e)
{
throw new Exception("Image Failed! : " + e.ErrorException.Message, e.ErrorException);
}
}
我对此并不过分满意,因为可能有其他控件可能会遇到同样的问题,并且在添加上述处理程序之前不会被检测到。