2014-01-22 4 views
0

Это мой первый пост, поэтому, пожалуйста, скажите мне, что я делаю что-то не так!Редактирование переменных в моей основной форме, из моих подформ

Я создал форму WPF, которая представляет собой небольшую игру на основе RPG. У меня есть кнопка, которая открывает новую форму, которая должна быть магазином. Я использую var ShopWindow = new Shop(); ShopWindow.ShowDialog();, чтобы открыть под форму.

Вопрос: как изменить свои переменные в основной форме? Предположим, я купил что-то на 10 единиц, затем я хочу снять 10 единиц из основной формы и добавить элемент.

Надеюсь, я дал достаточно информации, скажите, пожалуйста, что вам нужно!

+0

Возможно, вы сможете передать обратный вызов дочернему окну. Посмотрите на делегата Action. – Magus

+0

Добро пожаловать в StackOverflow. Чтобы получить максимальную отдачу от этого веб-сайта, воспользуйтесь несколькими моментами, когда вы сможете прочитать полезные советы в StackOverflow [Справочном центре] (http://stackoverflow.com/help). – Sheridan

ответ

0

Существует так много способов сделать это, но один легко может быть позволяют сказать:

Если у вас есть входная textBox1 на форме магазина, вы должны изменить свойство Модификаторы (на свойствах панели инструментов) из Частный для общественности, так что вы будете иметь доступ к нему из вашей основной формы, и вы будете в состоянии сделать некоторые, как это:

var ShopWindow = new Shop(); 
    ShopWindow.ShowDialog(); 
    var s = ShopWindow.textBox1.Text; 
+0

Это хороший способ и очень простой, но, к сожалению, невозможно сделать, если для приложения требуется .Show(), а не .ShowDialog()..ShowDialog() заморозит Thread of mainwindow, пока окно Shop не закроется. – Guilherme

+0

Конечно! Я просто попытался выполнить образец кода. В этом случае, чтобы сохранить простой способ, можно было бы создать ссылку на основную форму на дочернем магазине. Например: public MainWindow MainWindow {get; задавать; }, а затем определите: var ShopWindow = new Shop(); ShopWindow.ShowDialog(); ShopWindow.MainWindow = this; Таким образом, это приведет к инверсии вещей, установив для Public элементы, которые необходимы для доступа к дочернему элементу. – iuristona

+0

Да, это тоже хороший трюк. Другой трюк заключается в создании публичного статического MainWindow mw {get; задавать; } на App.xaml.cs, а затем установите эту ссылку в конструкторе главного окна: App.mw = this; Таким образом, доступ к главному окну можно получить из любого места. Так много способов ... – Guilherme

0

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

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

public event Action<Item, int> ItemBought = delegate { }; 

Итак, теперь, когда пользователь купить товар, вы должны назвать это:

ItemBought(item, 30); 

Где «пункт» является пункт о том, что игрок купил , а 30 - количество единиц, которое оно стоит.

Теперь в главном окне, вам необходимо открыть окно Shop с этим кодом:

Shop s = new Shop(); 
s.ItemBought += Item_Bought; 
s.Show(); 

И добавить этот метод, форма магазина поднимет в главном окне, когда игрок купить товар:

internal void Item_Bought(Item item, int cost) 
{ 
    // Update the main window here. 
} 
0

Один из самых простых способов сделать это, чтобы иметь класс, представляющий элементы пользователя, позволяет назвать его Inventory. В этом классе, вы можете поместить все соответствующие свойства, такие как decimal money, ObservableCollection<Item> Items и т.д. Тогда вы просто передать экземпляр этого из главного Window ребенка Window через конструктор:

var ShopWindow = new Shop(inventory); 
ShopWindow.ShowDialog(); 

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

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