Xamarin формирует PopupPage - PullRequest
0 голосов
/ 03 апреля 2019

Я использую Rg.Plugins.Popup.Pages для всплывающей страницы, когда я нажимаю кнопку, в середине страницы появляется всплывающее окно, и у меня есть радиокнопки для выбора, а когда я заканчиваю, я нажимаю на прозрачный фон для выхода. Моя проблема в том, что на фоновой странице у меня есть ярлык, который мне нужно изменить в соответствии с тем, что я выбрал на всплывающей странице в методе onAppearing на странице, всякий раз, когда я касаюсь фона всплывающей страницы, исчезают, а onAppearing фона страница никогда не вызывается!

Кнопка размещена на фоновой странице

 protected override void OnAppearing()
        {
            for (int i = 0; i < TestingClass.multiselection.Count; i++)
            {
                if (TestingClass.multiselection[i].is_selected)
                    btn.Text += TestingClass.multiselection[i].description;
            }
            base.OnAppearing();
        }

Я получаю значения из статического класса, когда появляется всплывающее окно, значения сохраняются следующим образом:

private void RadioButton_Clicked(object sender, System.EventArgs e)
        {
            var rb = sender as RadioButton;
            var selection = rb.BindingContext as multi_selection;
            if (selection != null && selection.is_selected == true)
            {
                selection.is_selected = false;
            }
            else
            if (selection != null && selection.is_selected == false)
            {
                selection.is_selected = true;
                TestingClass.multiselection.Add(selection);
            }
        }

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Есть два способа сделать это (насколько я знаю):

1) Вы можете создать EventHandler в своем PopupPage и подписаться на него при инициализации этого popupPage:

    MyPopupPage popup = new MyPopupPage();
    // Subscribe event
    popup.Save += SaveEventHandlerArgs;
    Navigation.PushPopupAsync(popup);

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

Примеры использования событий

2) Вы можете использовать MessagingCenter . Примеры есть в ссылке.

Надеюсь, это поможет!

1 голос
/ 04 апреля 2019

И OnApperearing, и OnDisappearing не будут вызываться, когда вы добавляете всплывающее окно в представлении.

В Документ Apple , оно говорит:

viewWillAppear:

Этот метод вызывается до того, как представление контроллера представления собирается добавить в иерархию представления, и до того, как настроены анимации для отображения представления.

В Android:

OnCreate

OnCreate - первый метод, который вызывается при создании действия.

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

Решение:

О том, как установить текст кнопки после выбора во всплывающем окне, я согласен с *Ответ 1029 *, позвольте мне уточнить его с помощью кода.

1.Использование eventHandle:

На всплывающей странице определите EventHandler:

public EventHandler SelectedStringChanged { get; set; }

В RadioButton_Clicked добавьте строку для вызова SelectedStringChanged:

    private void RadioButton_Clicked(object sender, System.EventArgs e)
    {
        var rb = sender as RadioButton;
        var selection = rb.BindingContext as multi_selection;
        if (selection != null && selection.is_selected == true)
        {
            selection.is_selected = false;
        }
        else
        if (selection != null && selection.is_selected == false)
        {
            selection.is_selected = true;
            TestingClass.multiselection.Add(selection);
        }

        //Add this line
        SelectedStringChanged(sender, e);
    }

На фоновой странице создайте метод для работы с btn.text:

    private void Handle_SelectedStringChanged(object sender, EventArgs rags)
    {
        // ... your code
        for (int i = 0; i < TestingClass.multiselection.Count; i++)
        {
            if (TestingClass.multiselection[i].is_selected)
                btn.Text += TestingClass.multiselection[i].description;
        }
    }

Вметод popup, используйте метод Handle_SelectedStringChanged:

    private async void OnOpenPupup(object sender, EventArgs e)
    {
        _loginPopup.SelectedStringChanged += Handle_SelectedStringChanged;

        await PopupNavigation.Instance.PushAsync(_loginPopup);
    }
MessageingCenter также будет работать.

На фоновой странице:

   MessagingCenter.Subscribe<MainPage>(this, "stringSelected", (sender) => {
          // do something whenever the "stringSelected" message is sent
            for (int i = 0; i<TestingClass.multiselection.Count; i++)
                {
                    if (TestingClass.multiselection[i].is_selected)
                    btn.Text += TestingClass.multiselection[i].description;
                }
        });

На всплывающей странице:

  private void RadioButton_Clicked(object sender, System.EventArgs e)
    {
        var rb = sender as RadioButton;
        var selection = rb.BindingContext as multi_selection;
        if (selection != null && selection.is_selected == true)
        {
            selection.is_selected = false;
        }
        else
        if (selection != null && selection.is_selected == false)
        {
            selection.is_selected = true;
            TestingClass.multiselection.Add(selection);
        }

        MessagingCenter.Send<MainPage>(this, "stringSelected");

    }

См .: сообщения-центр

0 голосов
/ 03 апреля 2019

В зависимости от платформы OnApperearing может быть вызван только один раз. Может быть, вы можете перевернуть его и подключить к OnDisappearing всплывающей страницы и использовать это для обновления ваших значений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...