Страница основных деталей xamarin CS0102 и CS0229 - PullRequest
0 голосов
/ 10 марта 2019

В данный момент я изучаю Xamarin, и мне нужно реализовать мастер-страницу для приложения.Я нашел официальные инструкции в Интернете, скачал образец кода, и у него есть 2 папки: одна с CS, другая с XAML.После попытки заменить эти папки только ContentPage, я получаю 2 ошибки неоднозначности, которые меня смущают.Вопрос в том, возможно ли сделать то, что я пытаюсь сделать, и что я могу сделать?Заранее спасибо.PS Ссылка на странице Master-Detail: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/master-detail-page

Это ошибка, которую я получаю, и как я пытаюсь это сделать

MainPage.xaml.CS:

using System;
using Xamarin.Forms;

namespace MyApp
{
    public partial class MainPage : MasterDetailPage // added partial. What is partial anyway?
    {
        MasterPage masterPage; //what's dis

        public MainPage()
        {
            var masterPage = new MasterPage(); // added var
            //Master = masterPage;
            Detail = new NavigationPage(new ContactsPage());

            masterPage.ListView.ItemSelected += OnItemSelected;

            if (Device.RuntimePlatform == Device.UWP)
            {
                MasterBehavior = MasterBehavior.Popover;
            }
        }

        void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var item = e.SelectedItem as MasterPageItem;
            if (item != null)
            {
                Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
                masterPage.ListView.SelectedItem = null;
                IsPresented = false;
            }
        }
    }
}

using System.Collections.Generic;
using Xamarin.Forms;

namespace MyApp
{
    public partial class MasterPage : ContentPage
    {
        public ListView ListView { get { return listView; } }

        ListView listView;

        public MasterPage()
        {
            InitializeComponent();
            var masterPageItems = new List<MasterPageItem>();
            masterPageItems.Add(new MasterPageItem
            {
                Title = "Contacts",
                IconSource = "contacts.png",
                TargetType = typeof(ContactsPage)
            });
            masterPageItems.Add(new MasterPageItem
            {
                Title = "TodoList",
                IconSource = "todo.png",
                TargetType = typeof(TodoListPage)
            });
            masterPageItems.Add(new MasterPageItem
            {
                Title = "Reminders",
                IconSource = "reminders.png",
                TargetType = typeof(ReminderPage)
            });

            listView = new ListView
            {
                ItemsSource = masterPageItems,
                ItemTemplate = new DataTemplate(() =>
                {
                    var grid = new Grid { Padding = new Thickness(5, 10) };
                    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(30) });
                    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star });

                    var image = new Image();
                    image.SetBinding(Image.SourceProperty, "IconSource");
                    var label = new Label { VerticalOptions = LayoutOptions.FillAndExpand };
                    label.SetBinding(Label.TextProperty, "Title");

                    grid.Children.Add(image);
                    grid.Children.Add(label, 1, 0);

                    return new ViewCell { View = grid };
                }),
                SeparatorVisibility = SeparatorVisibility.None
            };

            Icon = "hamburger.png";
            Title = "Personal Organiser";
            Padding = new Thickness(0, 40, 0, 0);
            Content = new StackLayout
            {
                Children = { listView }
            };
        }
    }
}

MainPage.xaml:

<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" 
				  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
				  xmlns:local="clr-namespace:MasterDetailPageNavigation;assembly=MasterDetailPageNavigation"
				  x:Class="MasterDetailPageNavigation.MainPage">
  <MasterDetailPage.Master>
  	<local:MasterPage x:Name="masterPage" />
  </MasterDetailPage.Master>
	<MasterDetailPage.Detail>
		<NavigationPage>
			<x:Arguments>
				<local:ContactsPage />
			</x:Arguments>
		</NavigationPage>
	</MasterDetailPage.Detail>
</MasterDetailPage>

MasterPage.xaml:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
			 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="using:MasterDetailPageNavigation"
			 x:Class="MyApp.MasterPage"
			 Padding="0,40,0,0"
			 Icon="hamburger.png"
			 Title="Personal Organiser">
    <StackLayout>
        <ListView x:Name="listView" x:FieldModifier="public">
            <ListView.ItemsSource>
                <x:Array Type="{x:Type local:MasterPageItem}">
                    <local:MasterPageItem Title="Contacts" IconSource="contacts.png" TargetType="{x:Type local:ContactsPage}" />
                    <local:MasterPageItem Title="TodoList" IconSource="todo.png" TargetType="{x:Type local:TodoListPage}" />
                    <local:MasterPageItem Title="Reminders" IconSource="reminders.png" TargetType="{x:Type local:ReminderPage}" />
                </x:Array>
            </ListView.ItemsSource>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid Padding="5,10">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="30"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Image Source="{Binding IconSource}" />
                            <Label Grid.Column="1" Text="{Binding Title}" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

App.xaml.cs

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp
{
    public partial class App : Application
    {
        public App()
        {
            MainPage = new MyApp.MainPage();
        }

        protected override void OnStart()
        {
            // Handle when your app starts
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

PS Пришлось загрузить его в виде фрагмента CSS, поскольку пример кода не очень хорошо работает.Я надеюсь, что это нормально.MasterPage должен содержать ссылки на ContacstsPage, ReminderPage и ToDoListPage.Я могу загрузить его, если это необходимо.

PS GitHub source.Может быть, это поможет: https://github.com/EdgarKa/MasterDetailPage

Ответы [ 2 ]

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

Решено, пришлось удалить ListView listView; (строка 10 в MasterPage.xaml.cs)

0 голосов
/ 10 марта 2019

Вы уже объявили masterPage переменную в файле xaml:

<local:MasterPage x:Name="masterPage" />

После этого вы можете использовать эту переменную в файле cs без нового объявления, например:

public MainPage()
{
    masterPage = new MasterPage(); // already declared in xaml

    Detail = new NavigationPage(new ContactsPage());

    masterPage.ListView.ItemSelected += OnItemSelected;

    // ...
}
...