#プロジェクタ投影用サブウィンドウを生成したい。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)を追加
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で生成しました。
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"
を設定します。
<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実行とかすれば真っ白枠無しタスクバーまで隠すサブウィンドウとメイン画面が表示されます。
果たしてこれでいいのか?と言う疑念はありますが・・・。