C++/WinRTでUWPその11　複数ウインドウの表示とUIの更新と　その1.

#1.今回やること
・[AppWindow](https://docs.microsoft.com/ja-jp/windows/apps/design/layout/app-window)を使用して複数のウインドウを表示します。
・表示するだけではあれなので、それぞれのウインドウから他のウインドウにあるTextBoxの文字を更新できるようにしていきます。
・[AppWindowの概要はここ。](https://docs.microsoft.com/ja-jp/windows/apps/design/layout/app-window)
・[サンプルはここ](https://github.com/microsoft/Windows-universal-samples/tree/main/Samples/AppWindow/cppwinrt)
・[UIの更新はこちら](https://docs.microsoft.com/ja-jp/windows/apps/design/basics/navigate-between-two-pages)
・今回もほぼMSのwebページに書かれていることをやります。

#2. 雛型の作成

##2-0. TextBoxにバインドするStringViewModelの作成
・いつものように作成します。[その7](https://qiita.com/lilac0011/items/54da15cc506b59e893d8)で作ったまんまです。

```xml:StringViewModel.idl
namespace appwin_1
{
    [Windows.UI.Xaml.Data.Bindable]
    runtimeclass StringViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged
    {
        StringViewModel();
        String DataString;
    }
}

```

```cpp:StringViewModel.h
#pragma once

#include "StringViewModel.g.h"

namespace winrt::appwin_1::implementation
{
    struct StringViewModel : StringViewModelT<StringViewModel>
    {
        StringViewModel();
        StringViewModel(const winrt::hstring value);

        void DataString(winrt::hstring const& value);
        winrt::hstring DataString();

        winrt::event_token PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const& handler);
        void PropertyChanged(winrt::event_token const& token) noexcept;

    private:

        winrt::hstring m_DataString;
        winrt::event<Windows::UI::Xaml::Data::PropertyChangedEventHandler> m_propertyChanged;
    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct StringViewModel : StringViewModelT<StringViewModel, implementation::StringViewModel>
    {
    };
}

```

```cpp:StringViewModel.cpp
#include "pch.h"
#include "StringViewModel.h"
#if __has_include("StringViewModel.g.cpp")
#include "StringViewModel.g.cpp"
#endif

namespace winrt::appwin_1::implementation
{
    StringViewModel::StringViewModel() : m_DataString(L"めいんぺ～～じ")
    {
    }
    StringViewModel::StringViewModel(const winrt::hstring value)
    {
        m_DataString = value;
    }
    void StringViewModel::DataString(winrt::hstring const& value)
    {
        m_DataString = value;
        m_propertyChanged(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"DataString" });
    }
    winrt::hstring StringViewModel::DataString()
    {
        return m_DataString;
    }
    winrt::event_token StringViewModel::PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const& handler)
    {
        return m_propertyChanged.add(handler);
    }
    void StringViewModel::PropertyChanged(winrt::event_token const& token) noexcept
    {
        m_propertyChanged.remove(token);
    }
}

```


##2-1. MainPageの変更
・Blank App(C++/WinRT）のプロジェクトテンプレートより、名前は「appwin_1」にして「MainPage」はこんな感じにしました。
・バインド関連の設定も忘れずにしてくださいね。

``````xml:MainPage.xaml

<Page
    x:Class="appwin_1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:appwin_1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid RequestedTheme="Default">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="4*" />
        </Grid.RowDefinitions>
        <Button x:Name="make_blank1" Content="make_blank1" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <Button x:Name="send_blank1_navi1" Content="send_blank1_navi1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <Button x:Name="send_blank1_navi2" Content="send_blank1_navi2" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <TextBox x:Name="main_text" Text="{x:Bind MainString.DataString, Mode=OneWay}" Grid.Row="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>

    </Grid>
</Page>

```

```xml:MainPage.idl

import "StringViewModel.idl";

namespace appwin_1
{
    [default_interface]
    runtimeclass MainPage : Windows.UI.Xaml.Controls.Page
    {
        MainPage();
        StringViewModel MainString{ get; };
    }
}

```

```cpp:MainPage.h

#pragma once

#include "MainPage.g.h"
#include "StringViewModel.h"

namespace winrt::appwin_1::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();

        appwin_1::StringViewModel MainString();

    private:
        appwin_1::StringViewModel m_mainString{ nullptr };

    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct MainPage : MainPageT<MainPage, implementation::MainPage>
    {
    };
}

```

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }
}

```

![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/f14b0649-823a-f1e1-df96-c20863702a67.png)
・今回はWInRTで作成しているので、右クリックしても例外は発生しません。


##2-2. BlankPage1の追加
・「メニュー」→「プロジェクト」→「モジュールの追加」より「Blank Page(C++/WinRT)」を選び、名前は「BlankPage1」として「追加」します。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/ad050eb8-fc98-3c89-433b-da53060633b3.png)
![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/33a0a991-20b4-fe8a-337a-a4911e20663e.png)
![2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/ebef3034-16ea-34f1-161f-2285ef1663d2.png)


・「BlankPage.xaml」にも邪魔な「Click Me」ボタンがついてくるので、削除して以下のようにしました。
・「BlankPage.xaml」のみ載せますが、「.h」や「.cpp」からも削除してください。

```xml:BlankPage1.xaml
<Page
    x:Class="appwin_1.BlankPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:appwin_1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid RequestedTheme="Default">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="4*" />
        </Grid.RowDefinitions>
        <Button x:Name="send_Mainpage_navi" Content="send_Mainpage_navi" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <Button x:Name="send_Mainpage_global" Content="send_Mainpage_global" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <Button x:Name="send_Mainpage_mem_func" Content="send_Mainpage_mem_func" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>
        <TextBox x:Name="blank1_text" Grid.Row="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" FontSize="24" Margin="5,5,5,5"/>

    </Grid>
</Page>

```

・これで準備が整いました。次はblank1ウインドウを表示させます。

#3. Blank1の表示

##3-1. MainPage.hへ追加
・MainPage.hへ「winrt/Windows.UI.WindowManagement.h」「winrt/Windows.UI.Xaml.Hosting.h」と「BlankPage1.h」を追加します。
・さらにメンバに「blank1Window」と「blank1Frame」を追加します。このメンバを通して、ウインドウの作成とUIの更新をしていきます。

```cpp:MainPage.h
#pragma once

#include "MainPage.g.h"
#include "StringViewModel.h"

//このヘッダーを追加
#include "winrt/Windows.UI.WindowManagement.h"
#include "winrt/Windows.UI.Xaml.Hosting.h"
#include "BlankPage1.h"

namespace winrt::appwin_1::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();
        appwin_1::StringViewModel MainString();

        //ここAppWindowとFrame追加（Blank1の表示）
        Windows::UI::WindowManagement::AppWindow blank1Window{ nullptr };
        Windows::UI::Xaml::Controls::Frame blank1Frame1{};

    private:
        appwin_1::StringViewModel m_mainString{ nullptr };

    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct MainPage : MainPageT<MainPage, implementation::MainPage>
    {
    };
}

```

##3-2. MainPage.cppへ追加
・MainPage.xamlのmake_blank1にClickを追加して、Clickイベントハンドラを追加してください。そしてイベントハンドラの戻り値の型は「IAsyncAction」へ変更してください。ここも[その7](https://qiita.com/lilac0011/items/54da15cc506b59e893d8)でやりましたね。
・その後、「TryCreateAsync」「Navigate」「SetAppWindowContent」「TryShowAsync」の順に呼び出すとBlank1ウインドウが表示されます。MFCだとモードレスダイアログを表示させるのと同じような感じで、簡単にできます。
・「Title」は半分蛇足です。これが無いと、Blank1のタイトルには「appwin_1」しか表示されないので。

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }
}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    //ここに追加（Blank1の表示）
    if (blank1Window == nullptr)
    {
        blank1Window = co_await winrt::Windows::UI::WindowManagement::AppWindow::TryCreateAsync();

        blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>());

        winrt::Windows::UI::Xaml::Hosting::ElementCompositionPreview::SetAppWindowContent(blank1Window, blank1Frame);
    }

    co_await blank1Window.TryShowAsync();
    blank1Window.Title(L"Blank1");
}

```

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/b02ec6a9-5171-87b4-0d2c-2b726b1e60b8.png)


#4. MainPageからBlankPage1のUIを更新する。
・[3.ページ間での情報の受け渡し](https://docs.microsoft.com/ja-jp/windows/apps/design/basics/navigate-between-two-pages#3-pass-information-between-pages)のやり方でMainPageからBlankPage1のUIを更新します。
・mainPageからBlank1のUIを更新するのは簡単で、以下の①②を実装するだけです。
①更新元（MainPage）で「Navigate()」を追加する。
②更新先（BlankPage1）で「OnNavigatedTo()メンバ関数を追加する。
（MSのwebページでは「オーバーライド」って書いてあるけど、overrideを追加するとエラーになるから注意！）
・では早速実装します。

##4-1. MainPageの更新
・「MainPage.xaml」のsend_blank1_navi1にClickのイベントハンドラを追加してください。
・その後、「MainPage.cpp」のsend_blank1_navi1_Click()にNavigate()を一行追加します。

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }
}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
    {
        blank1Window = co_await winrt::Windows::UI::WindowManagement::AppWindow::TryCreateAsync();

        blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>());

        winrt::Windows::UI::Xaml::Hosting::ElementCompositionPreview::SetAppWindowContent(blank1Window, blank1Frame);
    }

    co_await blank1Window.TryShowAsync();
    blank1Window.Title(L"Blank1");
}


void winrt::appwin_1::implementation::MainPage::send_blank1_navi1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    //Navigateの追加
    blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから ぶらんく1へ"));
}

```

##4-2.　BlankPage1の更新
・BlankPage1.hに「OnNavigatedTo()」メンバ関数を追加します。これは普通にキーボードで。

```cpp:BlankPage1.h
#pragma once

#include "BlankPage1.g.h"

namespace winrt::appwin_1::implementation
{
    struct BlankPage1 : BlankPage1T<BlankPage1>
    {
        BlankPage1();

        //OnNavigatedToを追加
        void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e) ;
    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct BlankPage1 : BlankPage1T<BlankPage1, implementation::BlankPage1>
    {
    };
}

```

・BlankPage1.cppに「OnNavigateTo()」の実装をします。
・BlankPage1の起動時にも「OnNavigatedTo()」が呼び出されます。そのときはe.Parametor()がnullptrとなっています。そのときはおとなしくreturn。最初これを知らないで例外が出たorz

```cpp:BlankPage1.cpp
#include "pch.h"
#include "BlankPage1.h"
#if __has_include("BlankPage1.g.cpp")
#include "BlankPage1.g.cpp"
#endif

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    BlankPage1::BlankPage1()
    {
        InitializeComponent();
    }

    void BlankPage1::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
    {
        //BlankPage1起動時はe.Parameter() == nullptrです。そのときは何もしない。
        if (e.Parameter() == nullptr)
            return;

        auto propertyValue{ e.Parameter().as < Windows::Foundation::IPropertyValue>() };

        if (propertyValue.Type() == Windows::Foundation::PropertyType::String)
            blank1_text().Text(winrt::unbox_value<winrt::hstring>(e.Parameter()));
        else
            blank1_text().Text(L"文字列じゃないよ！");
    }
}

```


![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/3b3f6b5a-014e-599f-c4b3-765d89937c70.png)


##4-3. MainPageをBlankPage1にする
・this->Frame()のNavigate()を呼び出すと、MainPageをBlankPage1へ遷移できます。ナビゲートはこっちの方が本来の使い方ですけどね。
・それではMainPageのsend_blank_navi2にClickのイベントハンドラを追加してみましょう。

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }

}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
    {
        blank1Window = co_await winrt::Windows::UI::WindowManagement::AppWindow::TryCreateAsync();

        blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>());

        winrt::Windows::UI::Xaml::Hosting::ElementCompositionPreview::SetAppWindowContent(blank1Window, blank1Frame);
    }

    co_await blank1Window.TryShowAsync();
    blank1Window.Title(L"Blank1");
}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    //Navigateの追加
    blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));

}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi2_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    //Navigateの追加
    this->Frame().Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));
}

```

・両方クリックしてどうなるか確かめてみてください。
![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/1c1b9a90-a394-1a50-24cd-eddfa55c613f.png)


##4-4. MainPageからBlancPage1を閉じる
・MainPage.xamlを以下のように変更して、「close_blank1」を追加しClickのイベントハンドラまで追加しました。
・そして、close_blank1_Clickの戻り値の型をIAsyncActionへ変更してから編集です。
・CloseAsync()を追加して、blank1Windowをnullptrにするだけです。
・brank1Frameはnullptrにしていませんが、何故かはやって確かめてください。
![4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/a957c068-ce7d-2c19-03db-1925685183da.png)

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }

}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
    {
        blank1Window = co_await winrt::Windows::UI::WindowManagement::AppWindow::TryCreateAsync();

        blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>());

        winrt::Windows::UI::Xaml::Hosting::ElementCompositionPreview::SetAppWindowContent(blank1Window, blank1Frame);
    }

    co_await blank1Window.TryShowAsync();
    blank1Window.Title(L"Blank1");
}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));
}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi2_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    this->Frame().Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));
}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::close_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
        return;

    //CloseAsyncの追加
    co_await blank1Window.CloseAsync();
    blank1Window = nullptr;
}

```

#5. BlankPage1からMainPageのUIを更新する？
・ここまでは簡単にできたので、今度はBlankPage1からMainPageのTextBoxを更新できるか試してみましょう。
・4.でやったのとは逆にBlankPage1でNavigate()を呼び出し、MainPageにOnNavigatedTo()の実装をするだけです。
・それではやってみましょう

##5-1. BlankPage1
・send_Mainpage_naviにClickのイベントハンドラを追加し、mainFrameを追加。それを通してMainPageのUI更新を試みます。
・xamlは省略して、.hと.cppのみですが。

```cpp:BlankPage1.h
#pragma once

#include "BlankPage1.g.h"

namespace winrt::appwin_1::implementation
{
    struct BlankPage1 : BlankPage1T<BlankPage1>
    {
        BlankPage1();

        //mainFrame追加
        Windows::UI::Xaml::Controls::Frame mainFrame{};

        void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e) ;
        void send_Mainpage_navi_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e);
    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct BlankPage1 : BlankPage1T<BlankPage1, implementation::BlankPage1>
    {
    };
}

```

```cpp:BlankPage1.cpp
#include "pch.h"
#include "BlankPage1.h"
#if __has_include("BlankPage1.g.cpp")
#include "BlankPage1.g.cpp"
#endif

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    BlankPage1::BlankPage1()
    {
        InitializeComponent();
    }

    void BlankPage1::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
    {
        //BlankPage1起動時はe.Parameter() == nullptrです。そのときは何もしない。
        if (e.Parameter() == nullptr)
            return;

        auto propertyValue{ e.Parameter().as < Windows::Foundation::IPropertyValue>() };

        if (propertyValue.Type() == Windows::Foundation::PropertyType::String)
            blank1_text().Text(winrt::unbox_value<winrt::hstring>(e.Parameter()));
        else
            blank1_text().Text(L"文字列じゃないよ！");
    }
}


void winrt::appwin_1::implementation::BlankPage1::send_Mainpage_navi_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    //Navigate追加
    mainFrame.Navigate(xaml_typename<appwin_1::MainPage>(), winrt::box_value(L"ぶらんく1からめいんぺ～～～～じへ"));
}

```

##5-2. MainPage
・MainPageにはNavigatedToの実装をします。BlankPage1とほぼ同じです。
・何か問題があり、UIが更新されなかった時のためにMainPageまで来たことをしめすメッセージダイアログを表示させます。MainPage→BlankPage1は何の問題も無くできたので、BlankPage1→MainPageも何の問題も無くできると思いますが。

```cpp:MainPage.h
#include "StringViewModel.h"

//このヘッダーを追加
#include "winrt/Windows.UI.WindowManagement.h"
#include "winrt/Windows.UI.Xaml.Hosting.h"
#include "BlankPage1.h"

namespace winrt::appwin_1::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();
        appwin_1::StringViewModel MainString();

        Windows::UI::WindowManagement::AppWindow blank1Window{ nullptr };
        Windows::UI::Xaml::Controls::Frame blank1Frame{};

        //NavigatedToの追加
        void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e);

    private:
        appwin_1::StringViewModel m_mainString{ nullptr };

    public:
        winrt::Windows::Foundation::IAsyncAction make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e);
        void send_blank1_navi1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e);
        void send_blank1_navi2_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e);
        winrt::Windows::Foundation::IAsyncAction close_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e);
    };
}

namespace winrt::appwin_1::factory_implementation
{
    struct MainPage : MainPageT<MainPage, implementation::MainPage>
    {
    };
}

```

```cpp:MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"
#include <winrt/Windows.UI.Popups.h>

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::appwin_1::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        m_mainString = make<appwin_1::implementation::StringViewModel>();
    }
    appwin_1::StringViewModel MainPage::MainString()
    {
        return m_mainString;
    }

    void MainPage::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
    {
        //NavigatedToの実装追加！
        if (e.Parameter() == nullptr)
            return;

        hstring blank1mes = winrt::unbox_value<winrt::hstring>(e.Parameter());
        if (blank1mes == L"")
            return;

        auto propertyValue{ e.Parameter().as < Windows::Foundation::IPropertyValue>() };

        if (propertyValue.Type() == Windows::Foundation::PropertyType::String)
            main_text().Text(blank1mes);
        else
            main_text().Text(L"文字列じゃないよ！");

        //念のためちゃんと届いていることを確認するためのメッセージダイアログ
        Windows::UI::Popups::MessageDialog msg{ blank1mes,L"とどいたよ～～～" };
        msg.ShowAsync();
    }

}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::make_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
    {
        blank1Window = co_await winrt::Windows::UI::WindowManagement::AppWindow::TryCreateAsync();

        blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>());

        winrt::Windows::UI::Xaml::Hosting::ElementCompositionPreview::SetAppWindowContent(blank1Window, blank1Frame);
    }

    co_await blank1Window.TryShowAsync();
    blank1Window.Title(L"Blank1");
}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    blank1Frame.Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));
}

void winrt::appwin_1::implementation::MainPage::send_blank1_navi2_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    this->Frame().Navigate(xaml_typename<appwin_1::BlankPage1>(), winrt::box_value(L"めいんぺ～～じから　ぶらんく1へ"));
}

winrt::Windows::Foundation::IAsyncAction winrt::appwin_1::implementation::MainPage::close_blank1_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    if (blank1Window == nullptr)
        return;

    co_await blank1Window.CloseAsync();
    blank1Window = nullptr;
}

```

・でやってみたのが、下です。
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/63858262-8e2b-32b6-e5a6-4806c21a54f8.png)

・大方の予想通り、BlankPage1からMainPageのUIをNavigate()で簡単に更新できません。NavigatedTo関数までは届いているのですが、そこでmain_textが更新できません。
・コンテキストを呼んだり、winrt::resume_foregroundを呼んだりしたのですけど、何故か駄目でした。

#次回へ続く
・というわけで、次回はBlankPage1からMainPageのTextBoxを更新するのをやります。
・BlankWindowのsend_Mainpage_globalとsend_Mainpage_mem_funcの実装ですね。
・一つはglobalって書いてあるから・・・
・もう一つはMSの[AppWindowのサンプル](https://github.com/microsoft/Windows-universal-samples/tree/main/Samples/AppWindow/cppwinrt)等でやっているstaticな・・・でやります。

[もくじへ](https://qiita.com/lilac0011/items/f53f7401ea7da31e3a0b)