2012-05-14 5 views
1

Я делаю небольшую игру в WPF, чтобы понять ее лучше, у меня есть родительский элемент управления, у которого есть 2 дочерних пользовательских элемента управления.Отдельный Usercontrol, выполняющий метод в другом Usercontrol

Первый элемент управления дочернего пользователя имеет кнопки, которые обновляют положение объекта во втором пользовательском контроле.

В MainWindow.xaml.cs У меня есть

controllersplaceholder.Content = new ControllerView1() 
gameplaceholder.Content = new GameView1() 

Как вы можете видеть, controllersplaceholder не имеет каких-либо знаний о GameView1. Чтобы обновить позицию элемента в GameView1, мне пришлось бы передать ссылку GameView1 в ControllerView1 и выполнить методы в GameView1(). Вопрос: как я могу это сделать так, чтобы ControllerView1, ControllerView2 легко выполнил методы в GameView1.

ответ

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(); 
    }; 
+0

Привет, это было бы в состоянии передать информацию от ControllerView к Gameview, а? Я думал об использовании DTO .. ​​но если я смогу избежать этого, то лучше –

+0

@LewsTherin: естественно. События в .NET позволяют передавать любые аргументы с помощью класса ['EventArgs'] (http://msdn.microsoft.com/en-us/library/system.eventargs.aspx) и классов, полученных из него (вы можете создать свой пользовательские). –

+0

@LewsTherin Да, вы можете. Создайте свойства в 'controller' для информации, которую вы хотите отправить, и свойств в' gameView' за то, что ему нужно получить. Содержимое лямбда, которое отвечает вышеприведенный ответ, может установить значение 'gameview' с соответствующим свойством от' controller'. – Servy

Смежные вопросы