Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
C# 如何通知UI在API中执行的操作?_C#_.net_Wpf_Winforms_C# 6.0 - Fatal编程技术网

C# 如何通知UI在API中执行的操作?

C# 如何通知UI在API中执行的操作?,c#,.net,wpf,winforms,c#-6.0,C#,.net,Wpf,Winforms,C# 6.0,我正在写一个简单的游戏,比如tic-tac-toe(只有我的更大)。游戏很简单:我的回合,检查是否赢了,机器人的回合,检查是否赢了。我有简单的UI和API,它们使用域实体(现在这并不重要)。所以当用户移动时,API会更新板,会知道下一步是机器人的移动,所以会这样做,并且。。。必须通知用户界面。这是我的问题 我的问题是: 如何通知用户界面机器人的移动?我的意思是,保持简单,但坚持最佳编程实践 我的第一个想法是在GameAPI类中创建一个事件。这是个好主意吗?今天会有新东西,C#6等等。。我不确定:

我正在写一个简单的游戏,比如tic-tac-toe(只有我的更大)。游戏很简单:我的回合,检查是否赢了,机器人的回合,检查是否赢了。我有简单的
UI
API
,它们使用
域实体
(现在这并不重要)。所以当用户移动时,API会更新板,会知道下一步是机器人的移动,所以会这样做,并且。。。必须通知用户界面。这是我的问题

我的问题是: 如何通知用户界面机器人的移动?我的意思是,保持简单,但坚持最佳编程实践

我的第一个想法是在GameAPI类中创建一个事件。这是个好主意吗?今天会有新东西,C#6等等。。我不确定:/现在UI是
WinForms
,但我想在其他UI中使用此API,比如WPF甚至mobile。以下是我的UI简化代码:

编辑:现在我讲的是单人游戏。UI和API都是客户端。下一步将通过中央服务器进行多人游戏,但现在是单人游戏

public partial class Form1 : Form
{
    private GameAPI api;

    public Form1()
    {
        InitializeComponent();
        api = new GameAPI();
    }

    private void boardClick(object sender, EventArgs e)
    {
        Field field = GetClickedField(e);

        MoveResult result = api.MakeMove(clickedColumn);
        if (result != null && result.Row >= 0)
        {
            MessageBox.Show(result.Row + "," + clickedColumn);
            if (result.IsConnected)
            {
                MessageBox.Show("Success!");
            }
        }
    }
}
及空气污染指数:

public class GameAPI
{
    public IGame CurrentGame { get; set; }

    public void CreateGame(GameType type)
    {
        CurrentGame = new SinglePlayerGame();
    }

    public Result Move(int column)
    {
        if (CurrentGame == null) return null;

        Player player = CurrentGame.GetNextPlayer();

        if (player.Type == PlayerType.Human) return CurrentGame.Move(column, player.Id);
    }

    public Result MoveBot()
    {
        // Simulate Bot's move...
    }
}
我的第一个想法是在GameAPI类中创建一个事件。这是个好主意吗


是的,为什么不呢?以现代UI框架数据绑定为例。数据绑定工作的关键点是在修改对象的某些属性值时提供属性更改通知(读取事件)。通常,这是通过
IPropertyNotifyChanged
接口实现的,它只是声明对
PropertyChanged
事件的支持的一种多态方式。这样,如果通过代码设置对象属性,UI将自动更新。希望您看到与您的案例的相似之处—API做了一些事情并引发了一个事件,UI(作为前面的某个点附加到该事件的处理程序)接收事件并相应地更新

“最佳”-除非您定义了“更好”的标准,否则不可能以产生高质量答案的方式回答您的问题。即使你缩小了你想要改进/优先考虑的内容的范围,它仍然可能是“主要基于意见”的帖子。我建议坚持“在我工作并完成我想要的事情时做到最好”:@AlexeiLevenkov best,你知道,我是说。解决方案必须有效+必须将其视为“良好编程”:)我将更改主题,使其不会被标记,“只是被标记”。NET 4.5+为此类场景提供了接口和实现类