LoginSignup
2
2

More than 3 years have passed since last update.

Prism WPF で サブウィンドウを全画面表示

Last updated at Posted at 2019-12-23

プロジェクタ投影用サブウィンドウを生成したい。Prismで!

簡単そうだけど意外とやり方が分かりませんでした。

メインウィンドウは普通のGUIなので枠が有ったりして良いんですが、
プロジェクタ投影に際して

  • 枠無し
  • 最大化
  • タスクバー無し

が必要になりました。
WPFで直接いじる分には↓の様なWindowを作れば良さそうです。

<Window 
 WindowStyle="None" WindowState="Maximized"/>
     <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="{x:Static SystemParameters.CaptionHeight}"
                      ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" 
                      UseAeroCaptionButtons="False"/>
    </WindowChrome.WindowChrome>

元々のGUI画面は必要なのでこれをサブWindowとして表示したいのですが、
あれ?っと躓いてしまいました。

とりあえず今回の対処は以下のようにしました。

前提

Prism templete pack導入済み VisualStudioを使って、テンプレートを「Prism Blank App(WPF)」でプロジェクト新規作成した状態から始めます。

.Net Framework 4.8、Select ContainerでUnityを選びました。

空のプロジェクトはNugetパッケージが無いのでビルドを通さないとPrism上手く認識してくれません。
とりあえずビルドしてみましょう。

この時点でPrismは7.2.0.1422でした。

サブWindowを出す変更

サブWindowの作成

Viewsに新規追加でPrismWindow(WPF)を追加

image.png

PrismWindow1.xamlを全画面表示に設定しました。

PrismWindow1.xaml
<Window x:Class="BlankApp1.Views.PrismWindow1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"             
             prism:ViewModelLocator.AutoWireViewModel="True"
             WindowStyle="None" WindowState="Maximized">
    <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="{x:Static SystemParameters.CaptionHeight}"
                      ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" 
                      UseAeroCaptionButtons="False"/>
    </WindowChrome.WindowChrome>
    <Grid>

    </Grid>
</Window>

App.xaml.csの変更

今回は起動時から終了時までずっと表示したいので、App.xaml.csのCreateShellで生成しました。

App.xaml.cs
using BlankApp1.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
using System.Windows;

namespace BlankApp1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
        protected override Window CreateShell()
        {
            var subwindow = new PrismWindow1();
            subwindow.Show();
            RegionManager.SetRegionManager(subwindow, Container.Resolve<IRegionManager>());
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
    }
}


App.xamlの変更

MainWindowが閉じたら全て終了したいのでShutdownMode="OnMainWindowClose"を設定します。

App.xaml
<prism:PrismApplication x:Class="BlankApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"
             xmlns:local="clr-namespace:BlankApp1"
             ShutdownMode="OnMainWindowClose">
    <Application.Resources>

    </Application.Resources>
</prism:PrismApplication>

とりあえず目的は達成

Debug実行とかすれば真っ白枠無しタスクバーまで隠すサブウィンドウとメイン画面が表示されます。

image.png

果たしてこれでいいのか?と言う疑念はありますが・・・。

2
2
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
2
2