it-swarm.com.ru

Как я должен передавать данные между Windows WPF, используя MainWindow (C #)?

В настоящее время я запускаю проект C #, в котором я моделирую простой банкомат, и поэтому мне потребуется несколько экранов. Я сталкивался с проблемой передачи данных между экранами раньше, когда я кодировал адаптацию настольной игры StockTicker, но я не думаю, что мой метод решения был очень хорошим. 

Многие мои проблемы связаны с тем, что я использую MainWindow в качестве основного окна приложения. Я могу легко передавать данные из вторичного окна обратно в главное окно, так как я могу получить доступ к свойствам класса Window1 после его закрытия. Однако, чтобы перейти от MainWindow к Window2, я должен добавить параметр в конструктор Window2, который позволит мне передать необходимые значения.

Хотя это работает для небольшого приложения, я считаю, что это будет очень длинным/грязным из-за большего количества вещей, которые необходимо передать в Window2. Кроме того, я вообще не знаю, как получить доступ к любому из методов, которые я объявляю для MainWindow из Window2. Поскольку MainWindow является основным экраном, большая часть моего кода находится в его классе. 

  • Как я могу получить доступ к методу, который я поместил в MainWindow из Window2 ??

(Для пояснения) Я провел некоторое время, оглядываясь по сторонам, и не могу найти четкого примера, который конкретно включает в себя MainWindow, и мне необходим доступ к переменным/методам, найденным в нем .


Вот мой код C # (я пытался иметь четкие имена переменных). Суть программы заключается в том, что в форме 1 можно сохранить некоторые данные, которые затем передаются в форму 2 при нажатии кнопки. Отсюда он может быть изменен по желанию пользователя, а затем к нему снова можно получить доступ из формы 1, когда форма 2 закрыта.

В этом примере я просто показываю, что нашел способ переноса данных из формы в форму, но я уверен, что есть лучший способ. В частности, я уверен, что есть более приятный способ, чем кодирование разных конструкторов с разными параметрами для класса Window2 .


Первый код окна WPF:

namespace Banking_System
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
        {
            string strForm1Text = txtForm1TextBox.Text;

            Window2 newWindow = new Window2(strForm1Text);
            newWindow.ShowDialog();

            txtForm2TextBox.Text = newWindow.strForm2Text;
        }
    }
}

Второй код окна WPF:

namespace Banking_System
{
    public partial class Window2 : Window
    {
        public string strForm2Text { get; set; }

        public Window2(string form1)
        {
            InitializeComponent();

            txtForm1.Text = form1;
        }

        private void btnSwitchBack_Click(object sender, RoutedEventArgs e)
        {
            strForm2Text = txtForm2TextBox.Text;
            this.Close();
        }
    }
}

Будет ли лучше создать еще одно окно WPF и загрузить его сразу после загрузки MainWindow, а затем спрятать MainWindow и «сделать вид», что другое окно было основным экраном? Потому что тогда я мог просто получить доступ к свойствам таким же образом, как я делал выше (при переходе от Window2 к MainWindow). 

то есть. Когда необходимо получить доступ к переменной/методу из другого окна, просто объявите новое временное окно и получите доступ к его свойствам/методам:

FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();

Основная привлекательность этого способа для меня заключается в том, что я могу получить доступ к методам в другом окне (как показано выше), чего я не могу сделать, используя MainWindow в качестве основной формы.

Резюме

  • Как я могу получить доступ к методу, который я поместил в MainWindow из Window2?
  • Лучше ли создать другое окно WPF и сделать вид, что это мой «основной экран», чтобы я мог легко получить доступ к его свойствам?
  • Если нет, есть ли лучший способ работы с MainWindow?

Если я что-то упустил, дайте мне знать. Спасибо!

6
Kendall Roth

Вы можете получить доступ к главному окну вашего приложения, не передавая ссылки между окнами. Application.Current.MainWindow возвращает экземпляр главного окна, который объявлен в app.xaml. Он возвращает Window (из которого происходит ваше главное окно), поэтому вам нужно будет привести его к действию, чтобы получить доступ к его членам.

Например, вы можете использовать этот код во втором окне:

((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";

Сказав это, я любезно предлагаю вам немного изучить шаблоны проектирования WPF (особенно MVVM ).

10
learningcs

Пройти все окно
это будет MainWindow

Window2 newWindow = new Window2(this);
1
paparazzo

Вы можете установить Первое окно как DataContext Второго окна:

 namespace Banking_System
 {       
     public partial class MainWindow : Window
     {
        public MainWindow()
        {
            InitializeComponent();           
        }

        private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
        {               
            Window2 newWindow = new Window2(strForm1Text);
            newWindow.DataContext = this;
            newWindow.ShowDialog();      
        }            
  }

 public partial class MainWindow2 : Window
 {
      public MainWindow2()
      {
         var window1 = this.DataContext;
      }
 }  

}

Кроме того, я бы порекомендовал, чтобы в вашем Window был установлен собственный ViewModel, так как это DataContext, который вы можете отправить в другое окно. Таким образом, вы также можете привязать свойства непосредственно к обоим окнам и не беспокоиться об их обновлении вручную. 

1
eran otzap