【问题标题】:How to Execute Functions from the Main Window如何从主窗口执行功能
【发布时间】:2016-05-17 12:51:14
【问题描述】:

我正在使用 C# 在 WPF 中开发一个小游戏。我同时打开了 2 个窗口,一个窗口用于 player1,一个窗口用于 player2。

现在我想在 player2 窗口中单击一个按钮时在 player1 中启动一个函数。

我试过了:

Player1 play1 = new Player1();
play1.Function();

然后它在第三个新窗口中执行该函数。但我想在第一个现有窗口中执行它。那我该怎么做呢?

【问题讨论】:

  • Player2 中保留对窗口Player1 的引用。
  • 嗯,我该怎么做?
  • 将它传递到您的Player2 窗口。创建一个参数类型为Player1的构造函数。
  • 我建议你使用一种 PlayerManager 来跟踪场景中发生的事情,并向玩家发送消息(如事件)。创建响应更快(非阻塞)的环境。

标签: c# wpf multithreading window


【解决方案1】:

您有更多选择如何做到这一点。 一个在这个链接中解释:link

其他的是将父窗口的引用传递给子窗口。

您在 Player2 窗口中定义属性 Player1,如:

public class Player2 {
   public Player1 Parent {private set;get}

   public Player2(Player1 parent) {
      this.Parent = parent;
   }

   public void MyMethod() {
       Parent.CustomMethodCall();
   }
}

您在 Player1 窗口中创建 Player2 对象,如:

var win = new Player2(this);
win.ShowDialog();

【讨论】:

  • 非常感谢!链接工作正常。但是您的代码解决方案对我不起作用。
【解决方案2】:

我要做的是使用事件从主窗口到子窗口进行通信。并在子窗口中监听主窗口的方法。

你有你的 PlayerWindow 就像你暴露一些事件一样。我还添加了一种在另一个方向(主窗口 -> 播放器窗口)进行通信的方法

public class PlayerWindow : window
{
   public event EventHandler UserClickedButton;

   //Here the function you call when the user click's a button
   OnClick()
   {
       //if someone is listening to the event, call it
       if(UserClickedButton != null)
          UserClieckedButton(this, EventArgs.Empty);
   }

   public void ShowSomeStuff(string stuff)
   {
      MyLabel.Content = stuff;
   }
}

然后你有你的主窗口,它创建两个窗口(每个玩家一个)并监听事件

public class MainWindow : Window
{
     public MainWindow()
     {
         //we create the first window
         PlayerWindow w1 = new PlayerWindow();
         //hook to the event
         w1.UserClickedButton += Player1Clicked;

         //same for player 2
         PlayerWindow w2 = new PlayerWindow();
         w2.UserClickedButton += Player2Clicked;

         //open the created windows
         w1.Show();
         w2.Show();
     }

     private void Player2Clicked(object sender, EventArgs e)
     {
         //Here your code when player 2 clicks.
         w1.ShowSomeStuff("The other player clicked!");
     }

     private void Player2Clicked(object sender, EventArgs e)
     {
         //Here your code when player 1 clicks.
         w2.ShowSomeStuff("The player 1 clicked!");
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多