#c# #xamarin.forms
#c# #xamarin.forms
Вопрос:
У меня есть MasterDetailPage и у меня есть боковое меню? с помощью MasterPageItem. Теперь я пытаюсь отклонить представленный элемент MasterPageItem. Как мне это сделать?
Вот моя страница MasterDetailPage:
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyApp;assembly=MyApp"
x:Class="MyApp.MainPage">
<MasterDetailPage.Master>
<local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:HomePage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
и метод onItemSelected:
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as MasterPageItem;
if (item != null)
{
if(item.Title == "Logout")
{
SecureStorage.RemoveAll();
MessagingCenter.Send<Paindown.App>((Paindown.App)Xamarin.Forms.Application.Current, "UpdateMenu");
IsPresented = false;
}
else
{
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
masterPage.listView.SelectedItem = null;
IsPresented = false;
}
}
}
Вот как я определяю страницу в моем боковом меню в MasterPage:
menu.Add(new MasterPageItem
{
Title = "Login",
TargetType = typeof(LoginPage)
});
Мой вопрос от LoginPage, как мне вернуться на главную страницу?
Ответ №1:
Вы могли бы использовать MessageCenter для отправки сообщения со страницы входа в MenuPage, а затем сделать так, чтобы в MenuPage выбранный элемент был домашней страницей.
Например, отправить сообщение со страницы входа:
void Button_Clicked(object sender, EventArgs e)
{
//MenuItemType.HomePage is a int value to represent the HomePage
MessagingCenter.Send<object, int>(this, "Home", (int)MenuItemType.HomePage);
}
Затем в MenuPage можно установить текущую страницу в качестве домашней страницы:
public partial class MenuPage : ContentPage
{
public MenuPage()
{
...
//ListViewMenu is the name of ListView in Slider menu
//menuItems is the ViewModel which contains the HomePage
MessagingCenter.Subscribe<object,int>(this, "Home", (senders,arg) =>
{
ListViewMenu.SelectedItem = menuItems[arg];
});
...
}
}
================================= Обновление================================
Если для этого требуется исправление, вам нужно открыть меню слайдера и закрыть его вручную.
До этого мы могли бы создать public static Instance
главную страницу (MasterDetailPage). Затем мы можем использовать его в MenuPage для использования IsPresented
свойства.
Главная страница:
public partial class MainPage : MasterDetailPage
{
...
public static MainPage Instance { set; get; }
...
public MainPage()
{
...
Instance = this;
..
}
}
Затем MenuPage изменит предыдущий метод MessagingCenter.Subscribe
следующим образом:
...
MessagingCenter.Subscribe<object,int>(this, "Home",async (senders,arg) =>
{
// open slider menu
MainPage.Instance.IsPresented = true;
// set selected item
ListViewMenu.SelectedItem = menuItems[arg];
// wait 0.5 second
await Task.Delay(500);
//close slider menu
MainPage.Instance.IsPresented = false;
});
...
Комментарии:
1. Да, вам нужно открыть меню слайдера и закрыть его вручную.
2. Могу ли я увидеть пример?
3. @user979331 Хорошо, я обновлю ответ.
4. @user979331 Я обновил его. Если ответ полезен, пожалуйста, не забудьте принять его в качестве ответа (нажмите ✔ в up.er левый угол этого ответа) и проголосуйте за него, это поможет другим, у кого есть подобная проблема.