Формы Xamarin: Как добавить страницу с аргументами в список? - PullRequest
0 голосов
/ 04 июня 2019

Я реализую Navigation Drawer в моем проекте. Я слежу за этим блогом за эту функцию.

Mainpage.xsml.cs:

public partial class NavigationDrawerPage : MasterDetailPage
    {
public List<MasterPageItem> menuList { get; set; }
        public MainPage()
        {
            InitializeComponent();

            menuList = new List<MasterPageItem>();

            // Adding menu items to menuList and you can define title ,page and icon
            menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(HomePage) });
            menuList.Add(new MasterPageItem() { Title = "Setting", Icon = "setting.png", TargetType = typeof(SettingPage) });
            menuList.Add(new MasterPageItem() { Title = "LogOut", Icon = "logout.png", TargetType = typeof(LogoutPage) });

            navigationDrawerList.ItemsSource = menuList;

            Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(HomePage)));
        }
}

MainPage.xaml

<StackLayout Grid.Row="1" Spacing="15">
                    <ListView x:Name="navigationDrawerList"
                  RowHeight="60"
                  SeparatorVisibility="None"
                  BackgroundColor="#e8e8e8"
                  ItemSelected="OnMenuItemSelected">

                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <StackLayout>
                                        <!-- Main design for our menu items -->
                                        <StackLayout VerticalOptions="FillAndExpand"
                             Orientation="Horizontal"
                             Padding="20,10,0,10"
                             Spacing="20">

                                            <Image Source="{Binding Icon}"
                         WidthRequest="30"
                         HeightRequest="30"
                         VerticalOptions="Center" />

                                            <Label Text="{Binding Title}"
                         FontSize="Medium"
                         VerticalOptions="Center"
                         TextColor="Black"/>
                                        </StackLayout>
                                        <BoxView HeightRequest="1" BackgroundColor="Gray"/>
                                    </StackLayout>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </StackLayout>

MasterPageItem.cs

public class MasterPageItem
    {
        public string Title { get; set; }
        public string Icon { get; set; }
        public Type TargetType { get; set; }
    }

Моя проблема заключается в добавлении моих страниц контента в список. Приведенный выше код работает отлично:

menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(SettingPage) });

Но у меня есть страница с одним аргументом, я не могу добавить аргумент внутри TargetType. Смотрите ниже код:

menuList.Add(new MasterPageItem() { Title = "Help", Icon = "help.png", TargetType = typeof(HelpPage(false)) });  //showing syntax errors for this line

Как добавить страницу содержимого с аргументами в элемент списка? Должен ли я изменить TargetType datatype?

1 Ответ

1 голос
/ 05 июня 2019

Вы можете передать параметры с помощью метода public static object CreateInstance(Type type, params object[] args);

Пункт

public class MasterPageItem
{
    public string Title { get; set; }
    public string Icon { get; set; }
    public Type TargetType { get; set; }

    public object[] args { get; set; }   //
}

MasterDetailPage

menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(HomePage), args = new object[] {"string", 1 , false} } ); // pass parameters whatever you want

private void OnMenuItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = (MasterPageItem)e.SelectedItem;
    Type page = item.TargetType;
    Detail = new NavigationPage((Page)Activator.CreateInstance(page,item.args));   //this line
    IsPresented = false;
}

Добавить конструктор с соответствующими параметрами

public HomePage()   //remain the default constructor 
{
    InitializeComponent();
}

public HomePage (string s , int i , bool b)   //add this
{
    InitializeComponent ();
}
...