【问题标题】:Window.loaded fires before the window is fully loadedWindow.loaded 在窗口完全加载之前触发
【发布时间】:2012-01-16 21:43:45
【问题描述】:

我有这个代码:
Window w = // something
w.Loaded += // some code to take a screenshot of the window
w.Show();

Loaded 事件在窗口完全加载之前触发,我得到这个图像:

我可以在w.Show() 之后和屏幕截图之前添加Thread.Sleep 或其他内容,但我需要为数百个窗口运行这段代码。
我的问题是:当窗口完全加载时是否会触发另一个事件?或某种方式来实现这一点,而无需让线程进入睡眠状态。

谢谢

【问题讨论】:

  • @H.B.我需要我项目中每个窗口的屏幕截图
  • @H.B.这真的不是他的问题的重点,即使对于 2 个窗口,这个问题也是有意义的。我不想为 2 张截图等待 4 秒,而且如果我使用太短的等待时间,我肯定不想不确定我是否会得到那个。有时您可能需要(上帝保佑)200 个具有不同数据的同一窗口的屏幕截图。我知道架构问题不容忽视,但像这样的问题并不少见,人们无法通过重新设计和重写大型代码库来解决它们。在我看来这个问题很合理。
  • @Nikola:我从来没有说过这个问题......

标签: wpf


【解决方案1】:

查看 MSDN 中的Object Lifetime Events 文章,您可以找到:

Loaded 事件在最终渲染之前引发,但在 布局系统已计算出所有必要的渲染值。 加载意味着包含元素的逻辑树 inside 是完整的,并连接到一个演示源 提供 HWND 和渲染表面。

您应该尝试一些不完全适合您需要的替代活动。您应该按以下顺序尝试:

请注意,这些事件可能会在您的窗口的生命周期内多次触发,因此请记住这一点来编写您的应用程序。

WPF 是数据驱动的 UI 架构,以我们在 WinForms 中习惯的方式使用它并不是很愉快。正如比我聪明的人曾经说过的那样,WPF 让困难的事情变得琐碎,让琐碎的事情变得困难。

【讨论】:

  • 第一个和第三个结果一样,第二个抛出异常
  • 抛出异常是什么意思?异常是否发生在您的处理程序或 .NET 框架中?其他两个的结果看起来完全一样还是正确加载了窗口镶边?另外,尝试RenderTargetBitmap.Render 将您的窗口渲染为位图。创建 RTB 类的实例,创建你的窗口的实例,不需要显示它,并将窗口传递给 Render 方法。
  • RenderTargetBitmap 适用于控件,但是当我尝试将它与 Window 一起使用时,它只会打印一个空白图像...我打算让它成为另一个 SO 问题:P ...关于异常: 修复它但结果还是一样
  • :) 您可以在尝试渲染之前尝试在窗口上调用 Arrange 方法。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多