1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2024: FluentUI Blazor のウェブアプリを作成 (ASP.NET Core / .Net 8.0 対象)

Posted at

Fluent Blazor テンプレートのインストール

  1. PowerShellで下記のコマンドを実行:
> dotnet new install Microsoft.FluentUI.AspNetCore.Templates
次のパッケージがインストールされます:
   Microsoft.FluentUI.AspNetCore.Templates

成功: Microsoft.FluentUI.AspNetCore.Templates::4.3.1により次のテンプレートがインストールされました。
テンプレート名                                   短い名前          言語  タグ
-----------------------------------------------  ----------------  ----  ---------------------------------
Fluent Blazor Web アプリ                         fluentblazor      [C#]  Web/Fluent/Blazor/WebAssembly
Fluent Blazor WebAssembly スタンドアロン アプリ  fluentblazorwasm  [C#]  Web/Fluent/Blazor/WebAssembly/PWA

>

テンプレートの FluentUI Blazor プロジェクトの新規作成

  1. Visual Studio 2022を開いて
  2. プロジェクトの新規作成を押下
    project_create.png
  3. Fluent Blazorのウエブアプリテンプレートを選択
  4. 「次」を押下
    fluent_create_1.png
  5. プロジェクト名を入力
  6. 「次」を押下
    fbb_1.png
  7. 「作成」を押下
    fluent_create_3.png

デフォルトのアプリの作り直し

fbb_2.png

デフォルトのアプリは Fluent UI を使用していますが、アプリケーションの基本的のレイアウトを定義するために Layout の代わりに MainLayout を使用したいと考えました。

MainLayout.razor

まず Components/Layout/MainLayout.razor の内容を書き換えましょう。

ビフォアー

@inherits LayoutComponentBase
<FluentLayout>
    <FluentHeader>
        FluentBlazorBasic
    </FluentHeader>
    <FluentStack Class="main" Orientation="Orientation.Horizontal" Width="100%">
        <NavMenu />
        <FluentBodyContent>
            <div class="content">
                @Body
            </div>
        </FluentBodyContent>
    </FluentStack>
    <FluentFooter>
        <div class="link1">
            <a href="https://www.fluentui-blazor.net" target="_blank">Documentation and demos</a>
        </div>
        <div class="link2">
            <a href="https://learn.microsoft.com/en-us/aspnet/core/blazor" target="_blank">About Blazor</a>
        </div>
    </FluentFooter>
</FluentLayout>

<div id="blazor-error-ui">
    An unhandled error has occurred.
    <a href="" class="reload">Reload</a>
    <a class="dismiss">🗙</a>
</div>

アフター

@inherits LayoutComponentBase

<FluentLayout>
    <FluentMainLayout Class="main">
        <Header>
            FluentBlazorBasic
        </Header>
        <Body>
            @Body
        </Body>
        <NavMenuContent>
            <NavMenu />
        </NavMenuContent>
    </FluentMainLayout>
    <FluentFooter>
        <div class="link1">
            <a href="https://www.fluentui-blazor.net" target="_blank">Documentation and demos</a>
        </div>
        <div class="link2">
            <a href="https://learn.microsoft.com/en-us/aspnet/core/blazor" target="_blank">About Blazor</a>
        </div>
    </FluentFooter>
</FluentLayout>

<div id="blazor-error-ui">
    An unhandled error has occurred.
    <a href="" class="reload">Reload</a>
    <a class="dismiss">🗙</a>
</div>

まとめ

  1. FluentLayoutFluentMainLayout を挿入
  2. FluentHeaderFluentMainLayout の中での Header に置き換え
  3. 「main」のスタック(FluentStack)を 2 つに分割:
    3.1. FluentBodyContent とそのコンテンツを @Body ディレクティブを含む単純な Body タグに変換
    3.2. NavMenu コンポーネントを NavMenuContent タグに配置します
  4. FluentMainLayout の中での Footer が存在してないので、FluentFooter がそのまま

NavMenu.razor

次に、変更に合わせて Components/Layout/NavMenu.razor の内容を書き換えましょう。

ビフォアー

@rendermode InteractiveServer

<div class="navmenu">
    <input type="checkbox" title="Menu expand/collapse toggle" id="navmenu-toggle" class="navmenu-icon" />
    <label for="navmenu-toggle" class="navmenu-icon"><FluentIcon Value="@(new Icons.Regular.Size20.Navigation())" Color="Color.Fill" /></label>
    <nav class="sitenav" aria-labelledby="main-menu" onclick="document.getElementById('navmenu-toggle').click();">
        <FluentNavMenu Id="main-menu" Collapsible="true" Width="250" Title="Navigation menu" @bind-Expanded="expanded">
            <FluentNavLink Href="/" Match="NavLinkMatch.All" Icon="@(new Icons.Regular.Size20.Home())" IconColor="Color.Accent">Home</FluentNavLink>
            <FluentNavLink Href="counter" Icon="@(new Icons.Regular.Size20.NumberSymbolSquare())" IconColor="Color.Accent">Counter</FluentNavLink>
            <FluentNavLink Href="weather" Icon="@(new Icons.Regular.Size20.WeatherPartlyCloudyDay())" IconColor="Color.Accent">Weather</FluentNavLink>
        </FluentNavMenu>
    </nav>
</div>

@code {
    private bool expanded = true;

}

アフター

<FluentNavMenu Id="main-menu" Title="Navigation menu">
    <FluentNavLink Href="/" Match="NavLinkMatch.All" Icon="@(new Icons.Regular.Size20.Home())" IconColor="Color.Accent">Home</FluentNavLink>
    <FluentNavLink Href="counter" Icon="@(new Icons.Regular.Size20.NumberSymbolSquare())" IconColor="Color.Accent">Counter</FluentNavLink>
    <FluentNavLink Href="weather" Icon="@(new Icons.Regular.Size20.WeatherPartlyCloudyDay())" IconColor="Color.Accent">Weather</FluentNavLink>
</FluentNavMenu>

まとめ

  1. サイド・メニューの折りたたみはメイン・レイアウトによって管理されるため、FluentNavMenu タグとそのコンテンツだけ必要です。
  2. 不要になった Collapsible 属性を削除。
  3. Width 属性も不要で残すと Body の内容のレイアウトが崩れる。

スタイル

最後に、ページが利用可能な空間をすべて占めるように、次の height ルールを wwwroot/app.cssbody スタイルのルールに追加

height: 100vh;

結果

ご覧のとおり、マークアップは簡素化されたのに、書き換えの外観はデフォルトのアプリケーションの外観と同じです:
fbb_3.png

次のステップ

Fluent Blazor チュートリアルをもっとほしいですか? 私の Todo リストのチュートリアルをご覧ください → 2024: Microsoft のチュートリアルの Blazor Todo リスト アプリを Fluent UI に変換

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?