locked
вызов метода(обработчика) из другой сраницы RRS feed

  • Вопрос

  • Как , находясь в page2, вызвать обработчик события из MainPage?

    поскольку этот обработчик для эллипса, а вызывается в page2 он не из эллипса, было хорошо заставить его думать, что он вызван эллипсом из MainPage.

    Спасибо.

    12 января 2012 г. 19:36

Ответы

  • Не создавайте новый экземпляр, сохраняйте существующий:

        public partial class MainPage : PhoneApplicationPage
        {
            public static MainPage MyMainPage;
            // Constructor
            public MainPage()
            {
                InitializeComponent();
    
                MyMainPage = this;
            }
        }
    

     


    Для связи [mail]
    • Помечено в качестве ответа K_K 16 января 2012 г. 13:02
    16 января 2012 г. 7:32

Все ответы

  • Понял как вызвать метод, но не понял как его вызвать глобально, что бы изменения остались на MainPage для того, что бы я мог пользоваться этими изменениями, если вызову этот метод с третьей страницы. Сейчас я просто создаю новые экземпляры класса MainPage на обеих страницах
    13 января 2012 г. 5:33
  • static не канает btw..
    13 января 2012 г. 5:38
  • Вы как и в предыдущих темах до ужаса лаконичны. Понимаете, это не придирка, это от того, что больше всего вопросы напоминают "принеси то, не знаю что"

    Чем плох вариант родительского класса для обеих страниц, реализующий этот метод? 

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

     

    И все же еще раз повторю: постарайтесь четче формулировать вопрос, тогда и помочь вам смогут гораздо быстрее и более полно.

    13 января 2012 г. 6:33
  • в общем...  есть три страницы MainPage,Page1,Page2

    в MainPage есть метод 

    public void el0_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    

    он жестко привязан к MainPage вызывающим его объектом (sender'jv тобиш)

    Из Page1 и Page2 мне надо эмитировать запуск метода el0_Tap. эмитировать - в смысле заставить метод думать, что он вызывается объектом из MainPage, а не новым из Page1,2. 

    для этого я попробовал следующее:

    В MainPage создал экземляр (уже не помню зачем) 

    public static MainPage mainpage = new MainPage();
    

    потом в Page1,2 вызывал метод следующим образом:

    Ellipse sender1 = new Ellipse();
    sender1.Name = "el" + ((TextBlock)sender).Tag; //задаю имя для пустого эллипса, такое же, как у существующего в MainPage
    MainPage.mainpage.el0_Tap(sender1, e);
    

    затем в методе, что бы подменить пустой sender1, где есть только имя, на настоящий эллипс(который уже существует в MainPage) делаю:

    foreach (var b in canva.Children.OfType<Ellipse>())
                {
                    if (b.Name == ((Ellipse)sender).Name) //нахожу существующий эллипс с таким же именем и подменяю sender.
                        sender = b;
                }
    


    по локальным данным это вроде бы работает, sender подменяется и метод проходит без ошибок, но визуально ничего не происходит. а Конкретно - должна меняться прозрачность у sender'a (т.е. у того, который уже существовал в MainPage.)

     

    вооть...

    13 января 2012 г. 8:18
  • такой вопрос - как со страницы Page1 вызвать обработчик события на странице MainPage не создавая новый экземпляр класса MainPage?
    13 января 2012 г. 23:18
  • ага, вы как раз сами увидели ошибку - вызывая new, вы создавали новый объект.

    Храните указатель на класс в App, когда MainPage вызывается, инициализируйте его, потом используйте

     

    14 января 2012 г. 5:26
  • какая разница, когда инициализировать? все равно я после этого имею новый объект, а не "оригинальную" MainPage.

     

    14 января 2012 г. 10:24
  • Не создавайте новый экземпляр, сохраняйте существующий:

        public partial class MainPage : PhoneApplicationPage
        {
            public static MainPage MyMainPage;
            // Constructor
            public MainPage()
            {
                InitializeComponent();
    
                MyMainPage = this;
            }
        }
    

     


    Для связи [mail]
    • Помечено в качестве ответа K_K 16 января 2012 г. 13:02
    16 января 2012 г. 7:32
  • Не создавайте новый экземпляр, сохраняйте существующий:

        public partial class MainPage : PhoneApplicationPage
        {
            public static MainPage MyMainPage;
            // Constructor
            public MainPage()
            {
                InitializeComponent();
    
                MyMainPage = this;
            }
        }
    

     


    Для связи [mail]
    эх..надо было попробовать, но я уже сделал по-другому - все на одной странице))
    16 января 2012 г. 13:02
  • Только не нужно забывать что после tombstoning-а и повторной активации MyMainPage может вполне оказаться null, или ссылаться совсем на новый объект, на Canvas которого не окажется эллипса.
    16 января 2012 г. 20:43