Приложение Xamarin падает без каких-либо исключений после реализации MasterDetailPage - PullRequest
0 голосов
/ 17 апреля 2020

мое Xamarin-приложение падает без исключения после того, как я реализовал MasterDeatilPage. Я придерживался Xamarin-Tutorial (https://www.youtube.com/watch?v=K2be1RfDYK4) и сравнивал свое решение с Microsoft-Docs для MasterDetailPage. В общем, я реализовал документацию, единственные различия - это расположение файлов и способ, которым я устанавливаю ItemsSource на MasterPage. Я слышал о проблеме, что не установленный заголовок MasterPage может привести к той же самой проблеме, что и я, но я определил свойство заголовка.

Вот выдержка из файловой системы моего решения:

Вот мой код:

MasterMenuItem.cs:

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

namespace WhaleEstimate.Models
{
    public class MasterMenuItem
    {
        public string Title { get; set; }
        public string IconSource { get; set; }
        public Color BackgroundColor { get; set; }
        public Type TargetType { get; set; }

        public MasterMenuItem(string title, string iconSource, Color color, Type type)
        {
            this.Title = title;
            this.IconSource = iconSource;
            this.BackgroundColor = color;
            this.TargetType = type;
        }
    }
}

MasterDetail.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:WhaleEstimate.Views.Menu;assembly=WhaleEstimate"
             xmlns:detailviews="clr-namespace:WhaleEstimate.Views.DetailViews;assembly=WhaleEstimate"
             x:Class="WhaleEstimate.Views.Menu.MasterDetail">
    <MasterDetailPage.Master>
        <local:MasterPage x:Name="masterpage"/>
    </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
        <NavigationPage>
            <x:Arguments>
                <detailviews:InfoScreen1/>
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>
</MasterDetailPage>

MasterDetail.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WhaleEstimate.Models;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace WhaleEstimate.Views.Menu
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MasterDetail : MasterDetailPage
    {
        public MasterDetail ()
        {
            InitializeComponent();
            masterpage.ListView.ItemSelected += OnItemSelected;
        }

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

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="clr-namespace:WhaleEstimate.Models"
             x:Class="WhaleEstimate.Views.Menu.MasterPage"
             Title="Test Project">
    <ContentPage.Content>
        <StackLayout x:Name="MasterStack" VerticalOptions="FillAndExpand">
            <StackLayout x:Name="TopStack">
                <Label Text="TestProject App" HorizontalOptions="Center" FontSize="Large"/>
            </StackLayout>

            <StackLayout x:Name="MidStack" VerticalOptions="FillAndExpand">
                <ListView x:Name="listView" SeparatorVisibility="None" x:FieldModifier="public">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid BackgroundColor="{Binding BackgroundColor}">
                                    <Image Source="{Binding IconSource}" Margin="0,10,0,10"/>
                                    <Label Grid.Column="1" Text="{Binding Title}" TextColor="Black" FontSize="Medium"/>
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackLayout>

            <StackLayout x:Name="BottomStack" VerticalOptions="EndAndExpand">
                <Button Text="Do some"/>
            </StackLayout>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

MasterPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WhaleEstimate.Models;
using WhaleEstimate.Views.DetailViews;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace WhaleEstimate.Views.Menu
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MasterPage : ContentPage
    {
        public ListView ListView { get { return ListView; } }
        public List<MasterMenuItem> items;

        public MasterPage ()
        {
            InitializeComponent ();
            SetItems();
        }

        private void SetItems()
        {
            items = new List<MasterMenuItem>();
            items.Add(new MasterMenuItem("InfoScreen1", "maus.jpg", Color.White, typeof(InfoScreen1)));
            items.Add(new MasterMenuItem("InfoScreen2", "maus.jpg", Color.White, typeof(InfoScreen2)));
            ListView.ItemsSource = items;
            //listView.ItemsSource = items;
        }
    }
}

1 Ответ

1 голос
/ 17 апреля 2020

Мне пришлось вернуть ListView, который определен в xaml, а не в code-behind-file. Таким образом, ключ менял линию public ListView ListView { get { return ListView; } } на public ListView ListView { get { return listView; } }

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