LoginSignup
10
12

More than 1 year has passed since last update.

WinUI 3.0 でサンプルアプリを作成する

Posted at

VisualStudio 2019 WinUI 3 language

WinUI 3.0 を使って、C++ のデスクトップアプリを作ってみました。

参考リンク

はじめに

Windows 11 で全面的に採用されている Fluent Design System。
それを実現する WinUI 3.0 の v0.8 (stable) が 2021年6月にリリースされました。

Windows 10 でも 1809 以降では、WinUI 3.0 が使えるようになっています。
ということで、実際にどんな感じになっているのか作ってみます。

環境準備

Visual Studio 拡張機能の Project Reunion を導入します。

image.png

Project Reunion から Windows App SDK へ

現在は、「Windows App SDK」という名称に変わりましたが、機能拡張を含む多くの部分に未だ「Project Reunion」が残っています。

これまで Store アプリには UWP が必須でしたが、将来的には Win32 アプリなども Store アプリとして配布できるようになるらしいです。そういう統合の意味を含めた Reunion という名前だったらしいです。

プロジェクトの作成

WinUI 3 in Desktop を選びます。

image.png

作成されたアプリ

「Click Me」ボタンしかなく寂しかったので、いくつか追加してみました。
XAML いじるだけなので、この辺りは簡単です。
背景色が黒ですが、これは 設定 の 色 で ダーク を選んでいるためです。
設定を ライト に変えれば、背景色は動的に白に変わります。

image.png

プロジェクト

ソースとパッケージの2つのプロジェクトから構成されています。
この時点では、Windows App SDK は v0.83 だとわかります。

※ 現時点の Windows App SDK では、MSIX パッケージでないと動きません。

image.png

作成したソースは、こちら

ソースコード抜粋(XAML)

<Window
    x:Class="WinUI3_cpp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WinUI3_cpp1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button x:Name="myButton" Click="myButton_Click">Click Me</Button>
        <ColorPicker
              ColorSpectrumShape="Ring"
              IsMoreButtonVisible="True"
              IsColorSliderVisible="True"
              IsColorChannelTextInputVisible="True"
              IsHexInputVisible="True"
              IsAlphaEnabled="False"
              IsAlphaSliderVisible="True"
              IsAlphaTextInputVisible="True" />
        <ToggleSwitch>トグルボタン</ToggleSwitch>
        <DropDownButton AutomationProperties.Name="Email">
            <DropDownButton.Content>
                <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE715;"/>
            </DropDownButton.Content>
            <DropDownButton.Flyout>
                <MenuFlyout Placement="Bottom">
                    <MenuFlyoutItem x:Name="mySendMail" Text="Send" Click="mySendMail_Click">
                        <MenuFlyoutItem.Icon>
                            <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE725;"/>
                        </MenuFlyoutItem.Icon>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem Text="Reply">
                        <MenuFlyoutItem.Icon>
                            <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE8CA;"/>
                        </MenuFlyoutItem.Icon>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem Text="Reply All">
                        <MenuFlyoutItem.Icon>
                            <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE8C2;"/>
                        </MenuFlyoutItem.Icon>
                    </MenuFlyoutItem>
                </MenuFlyout>
            </DropDownButton.Flyout>
        </DropDownButton>
        <AppBarButton x:Name="myAppBarButton" Icon="Like" Label="シンボルボタン" Click="myAppBarButton_Click"/>
        <RatingControl AutomationProperties.Name="Simple RatingControl" IsClearEnabled="True" IsReadOnly="False" />

    </StackPanel>
</Window>

ソースコード抜粋(C++)

#include "pch.h"
#include "MainWindow.xaml.h"
#if __has_include("MainWindow.g.cpp")
#include "MainWindow.g.cpp"
#endif

using namespace winrt;
using namespace Microsoft::UI::Xaml;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace winrt::WinUI3_cpp1::implementation
{
    MainWindow::MainWindow()
    {
        InitializeComponent();
    }

    int32_t MainWindow::MyProperty()
    {
        throw hresult_not_implemented();
    }

    void MainWindow::MyProperty(int32_t /* value */)
    {
        throw hresult_not_implemented();
    }

    void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        myButton().Content(box_value(L"Clicked"));
    }

    void MainWindow::myAppBarButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        myAppBarButton().Label(L"イイネ");
    }

    void MainWindow::mySendMail_Click(IInspectable const&, RoutedEventArgs const&)
    {
        mySendMail().Text(L"Sended!");
    }

}


感想

  • まだ v0.8 であり、MSIX パッケージ化が必要など制約も残っている。
  • XAML ベースの開発に慣れるにはいいかも。
  • XAML の GUI エディターがないので、XAML は全部手で編集が必要でちょっとげんなり。でも XAML Controls Gallery を Microsoft Store から入手すれば、XAML の編集もかなり楽にはなります。

XAML Controls Gallery

コントロールやそのオプションを選ぶと、その XAML 表現がリアルタイムで表示されます。

image.png

10
12
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
10
12