Если вы хотите использовать 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
}
}