none
Вернуть данные из дочернего окна [WPF] RRS feed

  • Вопрос

  • Здравствуйте. И снова это я.

    Теперь вопрос такой: на WPF есть две формы. Первая форма:

    using System.Windows;
    using System;
    using System.Xml.Linq;
    using System.Linq;
    
    namespace Library_Manager
    {
        /// <summary>
        /// Логика взаимодействия для MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private string Password;
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void connect_menu_Click(object sender, RoutedEventArgs e)
            {
                Connect cnt = new Connect(Password);    //тут вызываем следующую форму
                cnt.ShowDialog();
            }
        }
    }

    И вторая форма, которую вызываем:

    using System;
    using System.Linq;
    using System.Windows;
    using System.Xml.Linq;
    
    namespace Library_Manager
    {
        /// <summary>
        /// Окно запроса пароля
        /// </summary>
        public partial class Connect : Window
        {
            private string main;
            public Connect(string _main)
            {
                InitializeComponent();
                main = _main;
            }
    
            [STAThread]
            private void connection_Click(object sender, RoutedEventArgs e)
            {
                main = query_password_passwordbox.Password;
                this.Close();
            }
        }
    }

    И что то оно не работает. Вопрос вот в чём: как передать строку из второй формы в первую?

    MSDN AA User

    28 апреля 2012 г. 11:20

Ответы

  • using System.Windows;
    
    namespace Library_Manager
    {
        public partial class Connect : Window
        {
            public Connect()
            {
                InitializeComponent();
            }
    
            public string Password { get; set; }
    
            private void connection_Click(object sender, RoutedEventArgs e)
            {
                this.Password = query_password_passwordbox.Password;
                this.Close();
            }
        }
    }
    
    using System.Windows;
    namespace Library_Manager
    {
        public partial class MainWindow : Window
        {
            private string Password;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void connect_menu_Click(object sender, RoutedEventArgs e)
            {
                Connect cnt = new Connect {Password = this.Password};    //тут вызываем следующую форму
                cnt.ShowDialog();
    
                this.Password = cnt.Password;
            }
        }
    }
    

    но лучше сначала понять, почему оригинальный вариант не работает. :)

    • Помечено в качестве ответа Abolmasov Dmitry 28 апреля 2012 г. 12:45
    28 апреля 2012 г. 11:52
    Модератор
  • >> А разве после закрытия вызванной формы, объект формы не уничтожается?

    нет. объект формы (экземпляр Connect) будет существовать до тех пор, пока его не соберет GC. А это наступит точно после того, как на него перестанет ссылаться переменная cnt.


    28 апреля 2012 г. 12:31
    Модератор

Все ответы

  • Вот подобный вопрос, правда для WinForms, но суть та-же.
    28 апреля 2012 г. 11:40
    Модератор
  • using System.Windows;
    
    namespace Library_Manager
    {
        public partial class Connect : Window
        {
            public Connect()
            {
                InitializeComponent();
            }
    
            public string Password { get; set; }
    
            private void connection_Click(object sender, RoutedEventArgs e)
            {
                this.Password = query_password_passwordbox.Password;
                this.Close();
            }
        }
    }
    
    using System.Windows;
    namespace Library_Manager
    {
        public partial class MainWindow : Window
        {
            private string Password;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void connect_menu_Click(object sender, RoutedEventArgs e)
            {
                Connect cnt = new Connect {Password = this.Password};    //тут вызываем следующую форму
                cnt.ShowDialog();
    
                this.Password = cnt.Password;
            }
        }
    }
    

    но лучше сначала понять, почему оригинальный вариант не работает. :)

    • Помечено в качестве ответа Abolmasov Dmitry 28 апреля 2012 г. 12:45
    28 апреля 2012 г. 11:52
    Модератор
  • Я так понял, что Вы из MainWindow передаете данные в Connect. А мне нужно наоборот :) Из окна Connect передать данные обратно на главную MainWindow.

    MSDN AA User

    28 апреля 2012 г. 12:10
  • В моем примере Password в обе стороны передается. А в вашем - только из главного окна в Connect.
    • Помечено в качестве ответа asdfxcbneftyherwe 28 апреля 2012 г. 12:19
    • Снята пометка об ответе asdfxcbneftyherwe 28 апреля 2012 г. 12:19
    • Помечено в качестве ответа asdfxcbneftyherwe 28 апреля 2012 г. 12:21
    • Снята пометка об ответе Abolmasov Dmitry 28 апреля 2012 г. 12:45
    28 апреля 2012 г. 12:15
    Модератор
  • А разве после закрытия вызванной формы, объект формы не уничтожается?

    Connect cnt = new Connect {Password = this.Password};    //тут вызываем следующую форму
    cnt.ShowDialog();
    this.Password = cnt.Password; //к этому времени объект cnt уже должен быть уничтожен


    MSDN AA User

    28 апреля 2012 г. 12:25
  • >> А разве после закрытия вызванной формы, объект формы не уничтожается?

    нет. объект формы (экземпляр Connect) будет существовать до тех пор, пока его не соберет GC. А это наступит точно после того, как на него перестанет ссылаться переменная cnt.


    28 апреля 2012 г. 12:31
    Модератор