我試圖在 winforms 中使用 MVC 模式,但是當我嘗試呼叫事件時它總是為空。我將 GameView 表單傳遞給 Game 類,我將 CityButtonPressed 方法系結到事件,但是當我運行它時,似乎沒有任何系結。
class Game
{
private readonly IGameView _gameView;
public Game(IGameView view)
{
_gameView = view;
_gameView.CityButtonPressed = CityButtonPressed;
}
public void CityButtonPressed(object sender,EventArgs e)
{
//do something
}
}
public interface IGameView
{
event EventHandler CityButtonPressed;
}
public partial class GameView : Form,IGameView
{
public event EventHandler CityButtonPressed;
public GameView()
{
InitializeComponent();
}
protected virtual void OnButtonPressed(EventArgs e)
{
CityButtonPressed?.Invoke(this, e);
}
private void button1_Click(object sender, EventArgs e)
{
OnButtonPressed(EventArgs.Empty);
}
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var gameView = new GameView();
var game = new Game(gameView);
Application.Run(new GameView());
}
}
我究竟做錯了什么?
uj5u.com熱心網友回復:
這是您的代碼的精簡版本,表明它有效。
void Main()
{
var view = new GameView();
var game = new Game(view);
view.OnButtonPressed();
}
public interface IGameView
{
event EventHandler CityButtonPressed;
}
class Game
{
private readonly IGameView _gameView;
public Game(IGameView view)
{
_gameView = view;
_gameView.CityButtonPressed = CityButtonPressed;
}
public void CityButtonPressed(object sender, EventArgs e)
{
Console.WriteLine("Pressed");
}
}
public partial class GameView : IGameView
{
public event EventHandler CityButtonPressed;
public void OnButtonPressed()
{
if (CityButtonPressed == null)
Console.WriteLine("null");
CityButtonPressed?.Invoke(this, new EventArgs());
}
}
當我運行它時,我會Pressed進入控制臺。我所做的只是重構您的代碼,使其降至運行所需的最小量。
看起來您沒有正確連接它,或者您沒有向我們展示所需的實際最少代碼量。
更新
您正在創建兩個GameView實體。有你的問題。
var gameView = new GameView();
var game = new Game(gameView);
Application.Run(new GameView());
相反,試試這個:
var gameView = new GameView();
var game = new Game(gameView);
Application.Run(gameView);
uj5u.com熱心網友回復:
確保在呼叫之前Game使用GameView實體實體化了類CityButtonPressed。例如:
private Game game;
protected virtual void OnButtonPressed(EventArgs e)
{
game= new Game(this);
if (CityButtonPressed == null)
MessageBox.Show("null");
CityButtonPressed?.Invoke(this, e);
}
這對您來說不是一個好的解決方案,因為您將在Game某處需要該實體,但CityButtonPressed不應再為空。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/407603.html
標籤:
上一篇:如何在C#中等待某事完成?
