Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何使用MVVM创建定时弹出窗口?_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

Wpf 如何使用MVVM创建定时弹出窗口?

Wpf 如何使用MVVM创建定时弹出窗口?,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我正在创建一个基于MVVM Light的报警应用程序 该应用程序的主要功能是在特定时间弹出警报消息。 我已经创建了一个视图Alarm.xaml,在这里我创建并保存带有报警的任务,一个模型类Task.cs,一个视图模型类AlarmViewModel.cs 接下来,我创建了一个计时器,它每半分钟根据任务列表检查一次当前时间: System.Timers.Timer timer; //I am using Timer class on purpose because I want to have as

我正在创建一个基于MVVM Light的报警应用程序

该应用程序的主要功能是在特定时间弹出警报消息。 我已经创建了一个视图
Alarm.xaml
,在这里我创建并保存带有报警的任务,一个模型类
Task.cs
,一个视图模型类
AlarmViewModel.cs

接下来,我创建了一个计时器,它每半分钟根据任务列表检查一次当前时间:

System.Timers.Timer timer;
//I am using Timer class on purpose because I want to have asynchronous behavior 

private void InitTimer()
{
    timer = new Timer(30000); //Check every 30 seconds
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
    timer.Start();
}

private void TimerElapsed(object sender, ElapsedEventArgs e)
{
    DateTime currentTime;
    string message;

    currentTime = e.SignalTime;
    foreach (Task task in tasks)
    {
        if (task.AlarmTime.CompareTo(currentTime) <= 0)
        {
            message = string.Format("({0}) Task:\n{1}", 
                task.AlarmTime.ToString("dd/MMM/yy HH:mm"), task.Description);
            //This message needs to pop up
        }
    }
}
System.Timers.Timer;
//我有意使用Timer类,因为我希望具有异步行为
私有void InitTimer()
{
定时器=新定时器(30000);//每30秒检查一次
timer.Enabled=true;
timer.appeased+=新的ElapsedEventHandler(timerecursed);
timer.Start();
}
私有void timerecursed(对象发送方,ElapsedEventArgs e)
{
日期时间当前时间;
字符串消息;
currentTime=e.SignalTime;
foreach(任务中的任务)
{
如果(task.AlarmTime.CompareTo)(currentTime)您可以使用PRISM轻松地完成此操作(以及更多)

对于1:创建一个可由不同viewmodels加载的模块,作为提供报警触发器的中心服务。在编写应用程序时,加载该模块并将其与viewmodels绑定

对于2:PRISM支持所谓的交互请求,允许您以MVVM纯方式从viewmodel中弹出对话框(不违反viewmodel上视图的单向依赖关系)。它的工作方式类似于发送到UI的事件。请阅读PRISM指南(也可从上述链接获得)找到具体的代码示例来实现这一点


希望这能有所帮助。

对于1:我可能会将计时器放在应用程序中或视图定位器中。如果您使用IoC容器(例如Unity)放置计时器,这可能是一个好主意


对于2:您可以在MVVM中查看处理对话框的策略。

谢谢您的回复。我将查看PRISM,尽管我对MVVM Light非常陌生,我有点担心如果现在开始多线程,我会太困惑:)我想知道你是否可以详细说明一下,让我开始第一个问题的解决方案。你说的模块是什么意思,以及如何将其绑定到viewmodels?谢谢!PRISM与MVVM light一样,还有更多功能。它是关于能够在运行时组装产品,通过使用所谓的模块进行组装。很多设计都是基于模式和技术被整合到PRISM中,这让我选择了它而不是其他MVVM库。请帮我一个忙,并在可下载的PDF中浏览示例。我自己也不能给你一个更好的起点:-)明白了!
模块是PRISM范例中定义的一个术语。一旦你得到了棱镜的悬挂,你将不再是原来的你!