c# - 如何反复检查状况
问题描述
前段时间,我问了一个关于在C#程序中播放.mp3文件的问题。由于答案真的很有帮助,我决定在这里再次提出其他问题。我有一个代码:
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
if (wplayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
*something to do...*
}
else
{
}
在“else”的括号之间,我需要学习我的程序,例如:“当播放状态更改回到这个 if 条件时”(这基本上意味着说他:“只有当播放状态更改为“媒体结束”时才做我写的有事做”) 所以这是我的问题。怎么做?是否有任何“检查值”命令或对我有帮助的命令?谢谢您的回答!
解决方案
查看有关WindowsMediaPlayer 支持的 PlayStateChange 事件的完整文档
如果您不知道event
C# 中的内容是什么:
事件服务于您描述的目的 - 它们在发生某些事情时通知(发生这种事情的时间和原因由类开发人员定义)。在我们的例子中,WindowsMediaPlayer
有一个事件PlayStateChange
,当对象的播放状态改变时触发。
所以现在,即使玩家改变了它的状态并且事件是由类触发的,我们也永远不会知道它,因为我们从来没有订阅过接收来自事件的通知。
为此,您编写自己的函数(通常称为处理程序)。这个函数应该有一个特定的签名——它应该返回void
并接受两个参数:第一个类型object
(您可以将其转换为 WindowsMediaPlayer 类型,因为这种类型是我们事件的来源),第二个类型带有事件的补充数据)
一个例子直接来自上面的链接:
private void player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
// this code is executed when the playstate changed
// no need to check - developers of the WindowsMediaPlayer class
// tell you, that it happened, by calling this function
// they even give you some data about this changed state via arguments (sender and e above)
// Test the current state of the player and display a message for each state.
switch (e.newState)
{
case 0: // Undefined
currentStateLabel.Text = "Undefined";
break;
case 1: // Stopped
currentStateLabel.Text = "Stopped";
break;
... // check the link for more states
}
}
接下来,您必须为该事件订阅这个新编写的函数。所以当播放状态改变时,播放器类会调用我们的函数:
// Add a delegate for the PlayStateChange event.
player.PlayStateChange += new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(player_PlayStateChange);
所以基本上,你有一个函数接受关于事件的两个参数,当对象的事件被触发player_PlayStateChange
时,这个函数被调用。令人困惑的是一个类,它只是包装了我们的函数,你只能在包装后附加一个函数。PlayStateChange
player
AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler
我鼓励您在更简单易懂的示例或教程中了解有关 C# 中的事件和委托的更多信息。事件的概念对于编程至关重要。