locked
Передача переменных между страницами Page RRS feed

  • Вопрос

  • Подскажите можно ли как то передавать переменные и данные элементов между страницами Page в приложении?

    Например есть главная страница MainPage и вторая страница Page1 во фрейме страницы MainPage, есть ли способ передачи данных из Page1 в MainPage, например на Page1 ввести текст в TextBox который передастся в TexBlock MainPage страницы?

    Кроме этого метода больше нечего нету?:

    NavigationService.Navigate(new Uri("/MainPage.xaml?parameter=test", UriKind.Relative));

    Спасибо.



    • Изменено vik12 4 сентября 2016 г. 12:46
    4 сентября 2016 г. 12:45

Ответы

  • Не знаю правильно ли понял суть, но сделал вот как:

    Абсолютно не правильно. Класс для взаимодействия между страницами вообще не должен знать об этих страницах. Его задача хранить параметр на уровне приложения. Страницы же знают об этом параметре и используют его когда нужно.

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


    VB.Net - WPF, UWP

    5 сентября 2016 г. 6:19
  • Не зная, какой будет структура приложения и переходы, сложно что-то советовать.

    Я использую свой первый совет приблизительно так:

    Frame MyFrame;
    
    public Page1(Frame frm)
     {
       this.InitializeComponent();
       //инициализируем переменную на фрейм
       MyFrame = frm;          
     }
    
     //переход на другую страницу в том же фрейме
     MyFrame.Content = new Page2(MyFrame);
    Таким образом я всегда имею ссылку на фрейм в котором загрузилась текущая страница и могу с ним работать.

    4 сентября 2016 г. 19:16

Все ответы

  • Несмотря на то, что решение именно в описанном вами стиле существует, я считаю, что использовать его в современных платформах плохо.

    Я конечно не призываю осваивать MVVM, но все же базовые принципы этой модели для современных приложений обязательны. В частности вам не нужно, что то передавать между страницами. Вам нужно, что бы обе страницы работали с одним и тем же объектом (классом) через привязку и в коде. При таком раскладе ваши данные едины для всего приложения и вы можете вынуть их когда угодно и где угодно.


    VB.Net - WPF, UWP

    4 сентября 2016 г. 14:01
  • Лазейку можно найти всегда))). Но как и сказал LXGDARK, лучше использовать глобальные переменные. Если лень или это не ваш случай, то обратите внимание, что при создании страницы есть конструктор, в нем вы можете сделать сколько угодно параметров, передавать их и обрабатывать при инициализации.

    • Изменено Liliya Muray 4 сентября 2016 г. 17:04
    4 сентября 2016 г. 17:04
  • Вам нужно, что бы обе страницы работали с одним и тем же объектом (классом) через привязку и в коде

    Я так понял вы предлагаете создать отдельный класс с общими переменными? Мне нужно не это, как пример нужно когда я во фрейме в котором отображается страница Page1, ввожу текст в TexBox и затем жму кнопку, этот текст отображается в TextBlock на MainPage где находится фрейм. Надеюсь суть понятна.

    На WPF делаю так:

    static MainWindow mainWindow = (MainWindow)System.Windows.Application.Current.MainWindow;

    Затем к нужному элементу я могу обратиться так:

    mainWindow.myTextBlock = "мой текст";

    А вот как такое на WinRT сделать не пойму...

    4 сентября 2016 г. 17:21
  • Я так понял вы предлагаете создать отдельный класс с общими переменными? Мне нужно не это

    Я понял, что вам нужно не это, поэтому и сказал, что ваш подход не по феншую.

    Показанный вами код хоть и работает в WPF, но является пережитком WinForms. Начиная с WPF правильно для взаимодействия между окнами/страницами использовать объект данных. И "правильно" не потому, что умные дядьки так сказали, а потому, что это облегчает разработку и расширяет ваши возможности. Нужно всего лишь понять как это работает.

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

    Ну и что бы вы окончательно поняли, что  ваш подход не самый лучший - в WinRT/UWP нет возможности напрямую обратится к элементам другой страницы, что бы выдернуть из них значения.


    VB.Net - WPF, UWP

    4 сентября 2016 г. 17:39
  • А вот как такое на WinRT сделать не пойму...

    Заводите глобальную переменную...

    //переменная в App.xaml.cs
    internal static MainPage Mp = null;
    //использование в коде при инициализации MainPage
    App.Mp = this; 
    А далее во всех формах проекта, но это не правильный подход(((



    4 сентября 2016 г. 17:55
  • А вот как такое на WinRT сделать не пойму...

    Заводите глобальную переменную...

    //переменная в App.xaml.cs
    internal static MainPage Mp = null;
    //использование в коде при инициализации MainPage
    App.Mp = this; 
    А далее во всех формах проекта, но это не правильный подход(((



    Спасибо, а другого  способа нету? Просто хотелось бы некоторые части XAML интерфейса разбить на страницы Page, а вот как сделать взаимодействие общего кода, непонятно. Видимо придется "городить все" в MainPage...
    4 сентября 2016 г. 18:46
  • Не зная, какой будет структура приложения и переходы, сложно что-то советовать.

    Я использую свой первый совет приблизительно так:

    Frame MyFrame;
    
    public Page1(Frame frm)
     {
       this.InitializeComponent();
       //инициализируем переменную на фрейм
       MyFrame = frm;          
     }
    
     //переход на другую страницу в том же фрейме
     MyFrame.Content = new Page2(MyFrame);
    Таким образом я всегда имею ссылку на фрейм в котором загрузилась текущая страница и могу с ним работать.

    4 сентября 2016 г. 19:16
  • Спасибо, что поделись своим опытом, просто я не совсем еще опытен в разработке, поэтому и спросил совета. Спасибо еще раз, буду разбираться что к чему.
    4 сентября 2016 г. 19:26
  • для взаимодействия между окнами/страницами использовать объект данных.
    Не знаю правильно ли понял суть, но сделал вот как:
    public static string txt
            {
                get
                {
                    MainPage mainPage = (MainPage)((Frame)Window.Current.Content).Content;
                    return mainPage.textBlock1.Text;
                }
                set
                {
                    MainPage mainPage = (MainPage)((Frame)Window.Current.Content).Content;
                    mainPage.textBlock1.Text = value;
                }
            }
    На другой странице, делаю так:
    MainPage.txt = "какой то текст";



    5 сентября 2016 г. 2:55
  • Не знаю правильно ли понял суть, но сделал вот как:

    Абсолютно не правильно. Класс для взаимодействия между страницами вообще не должен знать об этих страницах. Его задача хранить параметр на уровне приложения. Страницы же знают об этом параметре и используют его когда нужно.

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


    VB.Net - WPF, UWP

    5 сентября 2016 г. 6:19
  • Вынужден констатировать, что с вашим уровнем знаний либо использовать один из предложенных костылей, либо узнать, что такое привязка данных.

    С Binding работать могу, но пока им пользуюсь только для связи с XAML и в DataTemplate, что то вроде:

    <TextBlock Text="{Binding myText}" />
    class TXT
            {
                public string myText { get; set; }
            }

    Это работает когда я создаю объекты, например ListViewItem в ListView, то есть перед созданием объектов. И можно ли через привязку данных вызвать функцию находящуюся на другой странице, например myFunction(string txt) ?

    Не могли бы вы показать пример где по нажатию кнопки с одной страницы Page, изменяется текст в TextBlock на странице MainPage с помощью привязки данных?

    Вы мне предлагаете использовать это ?

    • Изменено vik12 5 сентября 2016 г. 16:02
    5 сентября 2016 г. 12:54