Программа динамически добавленных кнопок в Xamarin - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь добавить код в динамически добавленные кнопки в формах Xamarin. Как добавить функциональность кнопкам, созданным с помощью следующего кода

   private async void Buttons(object sender, EventArgs e) {
        await Navigation.PushModalAsync(new ContentPage {
            Content = new StackLayout {
                VerticalOptions = LayoutOptions.Center,
                Children = {
                    new Button { Text = "Button1" },
                    new Button { Text = "Button2" },
                    new Button { Text = "Button3" }
                }
            }
        });
    }

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Если вы хотите использовать Button s с событиями (обычно это будет путь к go без модели представления), просто не существует способа использовать инициализаторы так, как вы это делали. Вы не можете подписаться на событие через инициализатор объекта

Вы должны были бы создать кнопки снаружи инициализатора массива

private void CreateContent()
{
    var button1 = new Button()
                      { 
                          Text = "Button 1"
                      };
    button1.Click += Button1_OnClick;

    var button2 = new Button()
                      { 
                          Text = "Button 2"
                      };
    // and so on
    return new ContentPage()
    {
        Content = new StackLayout
                {
                    VerticalOptions = LayoutOptions.Center,
                    Children = { button1, button2, button3 }
                }
    }
}

private void Button1_OnClick(object sender, EventArgs eventArgs)
{
    // handle button 1 bein clicked
}

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

<StackLayout>
    <Button Text="Button 1" Click="Button1_OnClick" />
    <Button Text="Button 2" Click="Button2_OnClick" />
    <Button Text="Button 3" Click="Button3_OnClick" />
</StackLayout>

и в вашем MyPage.xaml.cs

public class MyPage : ContentPage
{
    // ...

    public void Button1_OnClick(object sender, EventArgs args)
    {
        // whatever
    }

    public void Button2_OnClick(object sender, EventArgs args)
    {
        // whatever
    }

    public void Button3_OnClick(object sender, EventArgs args)
    {
        // whatever
    }
}
0 голосов
/ 11 марта 2020

Пожалуйста, проверьте ниже код, надеюсь, это будет полезно для вас.

var MainLayout = new StackLayout()
        {
            BackgroundColor = Color.Red
        };

        var button1 = new Button()
        {
            Text = "Button 1"                
        };

        var button2 = new Button()
        {
            Text = "Button 2"
        };

        var button3 = new Button()
        {
            Text = "Button 3"
        };

        button1.Clicked += Button1_Clicked;
        button2.Clicked += Button2_Clicked;
        button3.Clicked += Button3_Clicked;

        MainLayout.Children.Add(button1);
        MainLayout.Children.Add(button2);
        MainLayout.Children.Add(button3);

        Content = MainLayout;

Методы нажатия кнопки

private void Button1_Clicked(object sender, EventArgs e)
    {
        DisplayAlert("Alert","Button 1 Clicked", "Ok");
    }

    private void Button2_Clicked(object sender, EventArgs e)
    {
        DisplayAlert("Alert", "Button 2 Clicked", "Ok");
    }

    private void Button3_Clicked(object sender, EventArgs e)
    {
        DisplayAlert("Alert", "Button 3 Clicked", "Ok");
    }

Вывод:

enter image description here

Спасибо

...