мое 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;
}
}
}