oNaSsIs
09-09-2017, 12:32
Ciao a tutti, ho un problema con la MasterDetailPage di Xamarin.
L'idea sarebbe quella di avere la pagina Master sempre visibile, così che l'utente abbia un Hamburger Menu sempre a portata di mano, e una pagina Detail implementata con una NavigatedPage dove l'utente possa navigare.
Il comportamento che ottengo però non è quello atteso:
Clicco su una delle voci dell'hamburger menu
Clicco sul Button Go To Detail
Clicco il tasto Back
A questo punto mi aspetterei di tornare indietro sulla pagina MasterDetail con la pagina ContactsPage, invece torno indietro sulla pagina ContactsPage che però ora nasconde la pagina MasterDetail e quindi non vedo più l'Hamburger Menu.
Posto il codice e chiedo scusa se non è proprio pulito ma si tratta di 2 righe buttate giù al volo per ricreare il caso.
App.xaml.cs
public partial class App : Application
{
public static MasterDetailPage Mdp;
public App()
{
InitializeComponent();
Mdp = new MainPage();
MainPage = Mdp;
}
}
MainPage.xaml
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestXamarin"
x:Class="TestXamarin.MainPage">
<MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:ContactsPage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
MainPage.xaml.cs
public partial class MainPage : MasterDetailPage
{
public MainPage()
{
InitializeComponent();
masterPage.ListView.ItemSelected += OnItemSelected;
if (Device.RuntimePlatform == Device.Windows)
{
MasterBehavior = MasterBehavior.Popover;
}
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as string;
if (item != null)
{
Detail = new NavigationPage(new ContactsPage());
masterPage.ListView.SelectedItem = null;
IsPresented = false;
}
}
}
MasterPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestXamarin.MasterPage">
<StackLayout>
<ListView x:Name="listView" SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="5,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" Text="{Binding}" VerticalOptions="FillAndExpand" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
MasterPage.xaml.cs
public partial class MasterPage : ContentPage
{
public ListView ListView { get { return listView; } }
public MasterPage()
{
Title = "Ciao";
InitializeComponent();
var masterPageItems = new List<string>()
{"1","2"
};
listView.ItemsSource = masterPageItems;
}
}
ContactsPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestXamarin.ContactsPage">
<ContentPage.Content>
<StackLayout>
<Label Text="Contacts data goes here" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
<Button Text="Go To Detail" Command="{Binding Cmd}"/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
ContactsPage.xaml.cs
public partial class ContactsPage : ContentPage
{
public Command Cmd => new Command(async () => await Navigation.PushAsync(new ContactDetail()));
public ContactsPage()
{
BindingContext = this;
InitializeComponent();
}
}
E poi ContactDetail.xaml che è una semplice ContentPage con una Label...
L'idea sarebbe quella di avere la pagina Master sempre visibile, così che l'utente abbia un Hamburger Menu sempre a portata di mano, e una pagina Detail implementata con una NavigatedPage dove l'utente possa navigare.
Il comportamento che ottengo però non è quello atteso:
Clicco su una delle voci dell'hamburger menu
Clicco sul Button Go To Detail
Clicco il tasto Back
A questo punto mi aspetterei di tornare indietro sulla pagina MasterDetail con la pagina ContactsPage, invece torno indietro sulla pagina ContactsPage che però ora nasconde la pagina MasterDetail e quindi non vedo più l'Hamburger Menu.
Posto il codice e chiedo scusa se non è proprio pulito ma si tratta di 2 righe buttate giù al volo per ricreare il caso.
App.xaml.cs
public partial class App : Application
{
public static MasterDetailPage Mdp;
public App()
{
InitializeComponent();
Mdp = new MainPage();
MainPage = Mdp;
}
}
MainPage.xaml
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestXamarin"
x:Class="TestXamarin.MainPage">
<MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:ContactsPage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
MainPage.xaml.cs
public partial class MainPage : MasterDetailPage
{
public MainPage()
{
InitializeComponent();
masterPage.ListView.ItemSelected += OnItemSelected;
if (Device.RuntimePlatform == Device.Windows)
{
MasterBehavior = MasterBehavior.Popover;
}
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as string;
if (item != null)
{
Detail = new NavigationPage(new ContactsPage());
masterPage.ListView.SelectedItem = null;
IsPresented = false;
}
}
}
MasterPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestXamarin.MasterPage">
<StackLayout>
<ListView x:Name="listView" SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="5,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" Text="{Binding}" VerticalOptions="FillAndExpand" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
MasterPage.xaml.cs
public partial class MasterPage : ContentPage
{
public ListView ListView { get { return listView; } }
public MasterPage()
{
Title = "Ciao";
InitializeComponent();
var masterPageItems = new List<string>()
{"1","2"
};
listView.ItemsSource = masterPageItems;
}
}
ContactsPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestXamarin.ContactsPage">
<ContentPage.Content>
<StackLayout>
<Label Text="Contacts data goes here" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
<Button Text="Go To Detail" Command="{Binding Cmd}"/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
ContactsPage.xaml.cs
public partial class ContactsPage : ContentPage
{
public Command Cmd => new Command(async () => await Navigation.PushAsync(new ContactDetail()));
public ContactsPage()
{
BindingContext = this;
InitializeComponent();
}
}
E poi ContactDetail.xaml che è una semplice ContentPage con una Label...