xamarin формирует главную деталь. как выделить другой заголовок меню при нажатии на значок панели инструментов - PullRequest
0 голосов
/ 17 июня 2020

Я начал новый проект в кроссплатформенных формах xamarin, я выбрал «master-detail» в качестве шаблона. Итак, как вы можете видеть, шаблон на MainPage.xaml использует MenuPage для меню в левой части экрана и «product» для основного содержимого.

   <MasterDetailPage.Master>
    <views:MenuPage />
</MasterDetailPage.Master>

<MasterDetailPage.Detail>
    <NavigationPage>
        <NavigationPage.Icon>
            <OnPlatform x:TypeArguments="FileImageSource">
                <On Platform="iOS" Value="tab_feed.png"/>
            </OnPlatform>
        </NavigationPage.Icon>
        <x:Arguments>
            <views:Product />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

навигация используя опции меню слева, все работает как запланировано. Однако я добавил изображение корзины для покупок на панель инструментов Элементы на странице продукта.

 <ContentPage.ToolbarItems>
    <ToolbarItem Name="ImageShoppingCart" Icon="shoppingcart.png" Priority="0" Order="Primary" Activated="ShoppingCartIs_Clicked"/>
    </ContentPage.ToolbarItems>

Итак, со страницы продукта можно c нажать кнопку «покупки», которая находится в списке в MenuPage

<StackLayout VerticalOptions="FillAndExpand">
    <ListView x:Name="ListViewMenu" HasUnevenRows="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Label Text="{Binding Title}" FontSize="20" Grid.Column="1"  Grid.Row="0"/>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

Я спрашиваю об этом, потому что я пробовал обойти страницу product.cs. Вызов ShoppingCartIs_Clicked при щелчке по корзине:

   private async void ShoppingCartIs_Clicked(object sender, EventArgs e)
        {
            await RootPage.NavigateFromMenu(1);//1 being the id of shopping cart, which is then used to create a new Navigation page(shopping cart) and set master 'Detail' to this page
        }

Итак. Это работает, и отображается страница корзины покупок. однако, когда вы нажимаете на меню слева. исходный «продукт», который является первым параметром в меню, все еще выделен. Итак, как я могу выделить заголовок корзины покупок в меню? Могу ли я каким-то образом сделать listview глобальным в меню и вызвать его на странице продуктов?

 ListViewMenu.SelectedItem = menuItems[1];

Это, вероятно, закончилось kill, но я установил глобальную переменную 'newPage', и если она установлена ​​в Menupage, затем установите selectedItem

 private async void ShoppingCartIs_Clicked(object sender, EventArgs e)
    {

        App.NewPageToLoad = "Shopping";
        MenuPage tempMenu = new MenuPage();
        await RootPage.NavigateFromMenu(1);
    }

// затем в menyuPage

if (App.NewPageToLoad != null)
        {
            if (App.NewPageToLoad.Contains("Shopping"))
            {

                ListViewMenu.SelectedItem = menuItems[1];
            }
        }

это не выделяет значок «покупки» в списке меню.

есть ли более простой способ сделать это? Спасибо

enter image description here

ОБНОВЛЕНИЕ Спасибо @Junior за помощь, но, к сожалению, мы еще этого не сделали. Я пробовал то, что вы предложили, и не сработало.

Итак, я попытался использовать ListViewMenu.SelectedItem = menuItems[1];' для теста, чтобы вручную установить «покупки», как выбрано, когда приложение загружается изначально, и это работает ... Однако я попробуйте повторно назначить его, как вы предложили в Flayout (MenuPage), но он не обновлен в приложении.

Также стоит отметить в качестве теста при перезагрузке MenuPage. Я изменил ListView, чтобы он был заполнен новым списком menuItems2, в котором я изменил заголовки, включив в него «2», однако при загрузке приложения оно показало предыдущий список. Получается, что ListView не заполняется должным образом при загрузке нового MenuPage? Это объясняет, почему ListViewMenu.SelectedItem = menuItems[3]; не выделяет другой заголовок в меню? хотя код работает так неуверенно, почему он не работает. также подумал, что мне может потребоваться сбросить главную страницу, которая перезагрузит ее с fre sh, это не сработало, либо спасибо за вашу помощь, пока

menuItems2 = new List<HomeMenuItem>
            {
                new HomeMenuItem {Id = MenuItemType.Products, Title="Products 2", Icon =  "back_nav.png", Name = "test" },
                new HomeMenuItem {Id = MenuItemType.Shopping, Title="Shopping Cart 2", Icon =  "back_nav.png"},
                new HomeMenuItem {Id = MenuItemType.Browse, Title="Browse 2", Icon =  "back_nav.png"},
                new HomeMenuItem {Id = MenuItemType.About, Title="About 2", Icon =  "back_nav.png"},
            };

                    ListViewMenu.ItemsSource = menuItems2;  
ListViewMenu.SelectedItem = menuItems[3];

1 Ответ

0 голосов
/ 19 июня 2020

Хорошо, вы можете использовать MessagingCenter для отправки необходимого всплывающего элемента на Flayout page.

Отправить сообщение в Товары страница:

MessagingCenter.Send<object,int>(this, "Hi", (int)MenuItemType.About);

Получение сообщения в Flayout Страница:

MessagingCenter.Subscribe<object,int>(this, "Hi", (senders,arg) =>
{
    ListViewMenu.SelectedItem = menuItems[arg];
});

Дополнительно , только с его помощью можно перемещаться по странице от Продукты до Корзина .

Приведенный выше пример кода основан на этом примере проекта .

Эффект:

enter image description here

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