WPFでウィンドウを回転させる方法

.NET Core, .NET Framework, Windows, WPF

答えから述べると、Windowというコントロールを回転させる方法は無い。

しかし、ウィンドウのような見た目のコントロールを自作し、それを回転させることで目的は満足できる

例えば、次のようなつくりが考えられる。

まず、通常のWPFアプリ同様、Windowを1つ配置する。

このWindowは通常のウィンドウとしての機能は一切利用せず、その上に乗るコントロールを表示するためのただの透明な領域として利用する。

したがって、Windowは縁無し、透明、最大化状態とする。

プロパティ設定でいうと例えば次のような具合だ。

  • AllowsTransparency:True
  • Background:Transparent
  • ResizeMode:NoResize
  • WindowState:Maximized
  • WindowStyle:None

このWindowの上にBorderを1つ配置し、その中にウィンドウのような見た目のコントロールを自作して配置する。

BorderのLayoutTransformプロパティ(RenderTransformプロパティではないので注意)にRotateTransformを設定し角度を指定すると、その「ウィンドウっぽいもの」が指定した角度分だけ回転して表示される。

Windowは完全に透明なので、Borderの中身の機能さえ上手く作り込んでおけば、ユーザーから見ればBorderがアプリの「ウィンドウ」であるかのように見える。


しかしここまで読んだ人はこう思うかもしれない:「Borderの背後にあるWindowが画面全体を覆ってしまっているので、別アプリのウィンドウを操作しようとしてもできないのではないか」

WPFアプリの1つの特徴に、完全に透明な領域はマウスイベントが背後に透過する、というものがある。

ちょっとでも半透明では透過しない。完全に透明な場合に限る。

例えば、ドーナツ形のウィンドウがあったとして、ドーナツの真ん中の穴が完全に透明である場合、その穴の位置でクリックすると背後にあるウィンドウがアクティブになり最前面に表示される。背後にウィンドウがなければドーナツ形ウィンドウからフォーカスが外れる。

このため、Borderの背後のWindowが画面全体を覆っていても、他のアプリが操作できないという問題は起きない。