我正在编写一个WPF应用程序,它将监视一个feed。当从Feed中确定有新项目时,我想将小窗口作为通知生成。如果有人熟悉OS X上的Growl,那就是我想要做的事情。另外,我会指出这是我的第一个WPF应用程序(这是我第一次做了一段时间不是网络应用程序的东西!)。
我最初做的代码是这样的:
foreach(var feedNotification in newFeedNotifications) {
var popupWindow = new PopupWindow() { ... };
popupWindow.Show();
}
问题是以上是非常 CPU密集型,它占用了大约50%的CPU使用率。此外,我希望能够跟踪屏幕上通知的位置,以便如果下一个检查发现更多信息,则表明它知道最后一个当前可见的位置,而新的显示位于其他位置下方。
如何确保运行应用程序的计算机不会受到影响,我将如何实现这一目标?
编辑:我正在使用.NET 3.5 SP1框架
答案 0 :(得分:2)
我不是 100%,但我认为将窗口的新实例生成到由主窗口(或其中的对象)维护的集合中会更有效率 - 在)。然后,您可以创建一个可以由新生成的窗口订阅的事件。一旦新窗口正在观察主窗口或对象的更新,您就可以在主窗口上触发事件并让您的通知窗口处理剩下的事情。
就通知窗口跟踪而言,您可以允许通过另一个事件连接提醒通知窗口,显示有新窗口,并将其传递给它们(或允许它们从主对象中检索它)。 )您可以通过跟踪窗口何时获得焦点,将该窗口直接放在当前可见通知下方。因此,获得焦点的最后一个窗口是上次查看的窗口。一旦你有了现有的窗口,只需要在同一个位置(或略微偏移)创建新的窗口,然后调用顶部窗口的焦点。
通过焦点检查跟踪活动窗口的另一种方法是仅浏览主窗口中包含的窗口对象集合,因为集合将按创建顺序进行。希望这会有所帮助。
一分钟前发现this link关于弹出式控件,它们有一些与之相关的有用属性。
答案 1 :(得分:1)
是否绝对有必要为每个通知创建一个新窗口?虽然我没有测量过,但可能是创建新的WPF窗口是一项CPU密集型任务。如果是这种情况,那么您可以做很多事情来更改代码以减少使用CPU。
是否可以只创建一个通知窗口,它将包含所有新通知的列表?我意识到这不是Growl的工作原理,但这会以不同的方式提供相同的信息。
答案 2 :(得分:1)
为什么不使用Windows版的Growl? (http://www.growlforwindows.com)
如果无法做到这一点,只需创建一个透明窗口,其内容为ItemsControl; ItemsControl源是您的通知
答案 3 :(得分:0)
我不确定CPU利用率(并且在我的所有机器上都是双核并且具有良好的GPU,我并不关心它),但看起来你正试图做一个“气球弹出”,并且重新使用的好项目是codeproject WPF NotifyIcon(这是我在自己的RSS阅读器中使用的)