Шаблон Blazor с меню в верхней части - PullRequest
1 голос
/ 04 октября 2019

Я создал новое приложение Blazor из шаблона VS2019, в котором меню находится на боковой панели. Я потратил большую часть утра, пытаясь отобразить меню в верхней части страницы, как в текущем шаблоне MVC, но ничего не получилось!

У кого-нибудь есть шаблон блейзора с удаленной навигационной панелью сбоку и сверху?

Ответы [ 3 ]

4 голосов
/ 04 октября 2019

Боковая панель в Blazor не является чем-то особенным. Если вы отметите MainLayout.razor, то увидите ссылку на компонент NavMenu с классом sidebar:

<div class="sidebar">
    <NavMenu />
</div>

Если вы откроете NavMenu.razor, вы увидите, что это просто Bootstrap Navbar, удобно упакованный в многоразовый компонент.

Обновление

Blazor использует Bootstrap, что делает остальную часть проблемы проблемой таблицы стилей, а не проблемой Blazor.

Small Screen

Таблица стилей шаблона Blazor была создана для этого конкретного макета, похожего на проводник - вертикальная панель навигации слева, основная область справа. Цвета, размеры и, самое главное, поток, предназначены для этого. Недостаточно изменить один класс стилей.

С другой стороны, таблица стилей Razor pages была создана для «классического» внешнего вида начальной загрузки с меню сверху, контейнерами и строками всередина, колонтитулы и колонтитулы. Это означает, что мы можем «позаимствовать» таблицу стилей и макет из нового приложения Razor Pages.

  1. Создать новый проект с dotnet new webapp
  2. Удалить все в Blazor's site.css, кромепервая строка:
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
Скопируйте содержимое Razor's site.css в Blazor's site.css. Файл должен выглядеть так:
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');

a.navbar-brand {
    white-space: normal;
    text-align: center;
    word-break: break-all;
  }
...
Измените Blazor's Shared\MainLayout.razor, чтобы имитировать структуру в Razor's Shared\_Layout.cshtml:
@inherits LayoutComponentBase


<header>
  <NavMenu />
</header>

<div class="container">
    <main role="main" class="pb-3">
        @Body
    </main>
</div>

Здесь нет нижнего колонтитула, поскольку в шаблоне Blazor нет страницы Privacy.

Измените Shared\NavMenu.razor, чтобы использовать структуру и стили шаблона Razor. Элементы <a> должны быть заменены элементами NavLink. Другая сложность заключается в том, что переключатель в Razor работает через атрибуты data-toggle="collapse" data-target, которые не работают в Blazor. Вот почему необходим обработчик щелчков:
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
    <div class="container">
        <a class="navbar-brand" href="">blazornav</a>
        <button class="navbar-toggler" type="button" @onclick="ToggleNavMenu">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="@NavMenuCssClass"  @onclick="ToggleNavMenu">
            <ul class="navbar-nav flex-grow-1">
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="" Match="NavLinkMatch.All">
                        <span class="oi oi-home" aria-hidden="true"></span> Home
                    </NavLink>                
                </li>
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="counter">
                        <span class="oi oi-plus" aria-hidden="true"></span> Counter
                    </NavLink>
                </li>
                <li class="nav-item">
                    <NavLink class="nav-link text-dark" href="fetchdata">
                        <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
                    </NavLink>
                </li>
            </ul>
        </div>
    </div>
</nav>

Обработчик щелчков просто добавляет или удаляет класс collapse к базовому стилю навигации, скопированному из Razor

@code {
    bool collapseNavMenu = true;

    string baseMenuClass = "navbar-collapse d-sm-inline-flex flex-sm-row-reverse";

    string NavMenuCssClass => baseMenuClass + (collapseNavMenu ? " collapse" : "");

    void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }
}

ThisВ результате появляется горизонтальное меню с переключателем справа:

Large Screen

1 голос
/ 04 октября 2019

Я только что прошел через то же самое вчера. Очень расстраивает. Мне удалось избавиться от боковой панели и поставить меню сверху. К сожалению, после того, как я это сделал, в небольших устройствах, когда меню расширялось после нажатия кнопки переключения, торговая марка, кнопка переключения и меню были вертикально центрированы в расширенной области, где можно ожидать появления только элементов меню. Марка и кнопка переключения должны оставаться в верхнем ряду.

Расширенное меню

Этим утром я наткнулся на сообщение (https://www.nativoplus.studio/blog/blazor-layouts/), в котором предлагаетсязагрузочный css, включенный в шаблон Blazor, изменен. Чтобы получить поведение по умолчанию, необходимо закомментировать его (и site.css) из _Host.cshtml и заменить его официальным файлом начальной загрузки css.

Когда я это сделал, меню стало работать почти правильно. Странный формат исчез. Моя проблема сейчас в том, что на небольших устройствах после выбора меню меню не разваливается. Я предполагаю, что это связано с тем, какBlazor обрабатывает изменения пользовательского интерфейса. Другими словами, поскольку содержимое меню не изменилось после выбора, оно не выполняет повторную визуализацию меню.

Если я подойду так, чтобы свернуть меню, явыложу здесь.

0 голосов
/ 08 октября 2019

Следуя совету @Panagiotis Kanavos, мне удалось создать базовый шаблон / решение для верхней строки меню:

BlazorTopMenu

...