C# 在WPF应用程序中创建新窗口

C# 在WPF应用程序中创建新窗口,c#,.net,wpf,C#,.net,Wpf,我正在编写一个WPF应用程序来监视提要。当从提要中确定了新项目时,我希望生成一个小窗口作为通知。如果有人熟悉OSX上的咆哮,那就是我想做的。此外,我还要指出,这是我的第一个WPF应用程序(也是我第一次做了一些暂时不是web应用程序的事情!) 我最初是这样编写代码的: foreach(var feedNotification in newFeedNotifications) { var popupWindow = new PopupWindow() { ... }; popupWindow

我正在编写一个WPF应用程序来监视提要。当从提要中确定了新项目时,我希望生成一个小窗口作为通知。如果有人熟悉OSX上的咆哮,那就是我想做的。此外,我还要指出,这是我的第一个WPF应用程序(也是我第一次做了一些暂时不是web应用程序的事情!)

我最初是这样编写代码的:

foreach(var feedNotification in newFeedNotifications) {
  var popupWindow = new PopupWindow() { ... };
  popupWindow.Show();
}
问题是,上面的问题是非常CPU密集,占用了大约50%的CPU使用率。此外,我希望能够跟踪屏幕上通知的位置,以便在下一次检查发现更多信息时,它知道当前最后一个可见通知的位置,并且新通知显示在其他通知的下方

在确保运行应用程序的计算机不会被拖下水的同时,我如何实现这一点

编辑:我使用的是.NET 3.5 SP1框架

我不是百分之百支持这一点,但我认为将窗口的新实例生成到主窗口(或其中的对象)维护的集合中会更有效。然后,您可以创建一个可由新生成的窗口订阅的事件。新窗口监视主窗口或对象的更新后,您可以在主窗口上触发事件,让通知窗口处理其余的更新

就通知窗口跟踪而言,您可以允许通过另一个事件连接向通知窗口发出警报,通知窗口将显示一个新窗口,并将其传递给它们(或允许它们从主对象检索该窗口)通过跟踪窗口接收焦点的时间,可以将该窗口直接放置在当前可见通知的下方。因此,最后一个接收到焦点的窗口就是最后一次查看的窗口。拥有现有窗口后,只需在相同位置(或稍微偏移)创建新窗口,然后调用顶部窗口的焦点即可

通过焦点检查跟踪活动窗口的另一种方法是只查看主窗口中包含的窗口对象集合,因为集合是按创建顺序排列的。希望这有帮助

一分钟前发现了一些与弹出控件相关的有用属性。

我不是100%同意这一点,但我认为将窗口的新实例生成到主窗口(或其中的对象)维护的集合中会更有效。然后,您可以创建一个可由新生成的窗口订阅的事件。新窗口监视主窗口或对象的更新后,您可以在主窗口上触发事件,让通知窗口处理其余的更新

就通知窗口跟踪而言,您可以允许通过另一个事件连接向通知窗口发出警报,通知窗口将显示一个新窗口,并将其传递给它们(或允许它们从主对象检索该窗口)通过跟踪窗口接收焦点的时间,可以将该窗口直接放置在当前可见通知的下方。因此,最后一个接收到焦点的窗口就是最后一次查看的窗口。拥有现有窗口后,只需在相同位置(或稍微偏移)创建新窗口,然后调用顶部窗口的焦点即可

通过焦点检查跟踪活动窗口的另一种方法是只查看主窗口中包含的窗口对象集合,因为集合是按创建顺序排列的。希望这有帮助


一分钟前发现了一些与弹出控件相关的有用属性。

是否绝对有必要为每个通知创建一个新窗口?虽然我还没有衡量这一点,但可能是创建新的WPF窗口是一项CPU密集型任务。如果是这样的话,那么就没有什么可以改变代码以减少CPU的使用


是否可以只创建一个通知窗口,并包含所有新通知的列表?我意识到这不是咆哮的工作方式,但它会以不同的方式提供相同的信息。

是否绝对有必要为每个通知创建一个新窗口?虽然我还没有衡量这一点,但可能是创建新的WPF窗口是一项CPU密集型任务。如果是这样的话,那么就没有什么可以改变代码以减少CPU的使用


是否可以只创建一个通知窗口,并包含所有新通知的列表?我意识到这不是咆哮的工作方式,但这将提供相同的信息,只是以不同的方式。

我不确定CPU的利用率(以及在我所有的机器上都有好的GPU的双核,我不太在乎),但看起来你正试图做一个“气球弹出”,好的重用项目是(这是我在自己的RSS阅读器中使用的)

我不确定CPU的利用率(而且我的所有机器上都有好的GPU,所以我不太在乎),但看起来你正在尝试做一个“气球式弹出”,重复使用的好项目是(这就是我在自己的RSS阅读器中使用的)为什么不使用Windows版本的Growl?()


如果不可能,只需创建一个透明窗口,其内容是ItemsControl;ItemsControl源是您的通知

为什么不使用Windows版本的Growl?()


如果不可能,只需创建一个透明窗口,其内容是ItemsControl;ItemsControl源是您的通知

您使用的是Framework 3.5还是Framework 3.5.1?启动时间和性能有很大差异。您使用的是Framework 3.5还是Framework 3.5.1?启动时间和性能有很大差异。I我不知道那是真的,