我正在WPF中制作一个小游戏来更好地理解它,我有一个父控件有2个子用户控件。
第一个子用户控件具有更新第二个用户控件中对象位置的按钮。
在MainWindow.xaml.cs中 我有
controllersplaceholder.Content = new ControllerView1()
gameplaceholder.Content = new GameView1()
如您所见,controllersplaceholder对GameView1一无所知。 要在GameView1中更新元素的位置,我必须将GameView1引用传递给ControllerView1并在GameView1()中执行方法。 问题是我该怎么做才能这样做 ControllerView1,ControllerView2将轻松地在GameView1中执行方法。
答案 0 :(得分:3)
您可以使用events。只需在ControllerView1
上声明一个事件,请说:
public event EventHandler RequestReposition;
创建对象时,请GameView1
订阅并对控制器的事件作出反应:
var controller = new ControllerView1();
var gameView = new GameView1();
// here we're subscribing to controller's event
controller.RequestReposition += gameView.UpdatePosition;
controllersplaceholder.Content = controller;
gameplaceholder.Content = gameView;
现在,无论何时从控制器提出事件,都会通知任何订阅的人,并采取适当的行动(执行订阅的方法)。
请注意,您的游戏视图方法不必完全匹配事件签名;在匿名方法的帮助下,您可以动态创建匹配的事件处理程序,并使用GameView1
中现有的方法:
// subscribtion with lambda
controller.RequestReposition += (sender, args) =>
{
gameView.UpdatePosition();
gameView.Refresh();
};