Javascript External Library

2021-03-13

WPF で透過アプリケーションを作る

Windows 7以降、アプリケーションごと透過できるようになりました。普段は特に必要ない機能ではありますが、常駐の情報表示アプリケーションなどでは便利な場面もあります。

xmalだけでやろうとするとだいたいこんな感じ
<Window x:Class="Lutheta.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        ShowInTaskbar="False"
        WindowStyle="None"
        AllowsTransparency="True"
        Left="200" Top="200" Height="480" Width="640">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonDown">
      <i:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" MethodName="DragMove" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
  <Window.Style>
    <Style TargetType="Window">
      <Setter Property="ResizeMode" Value="NoResize" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsActive}" Value="True">
          <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Window.Style>
  <Grip />
</Window>

要点は次のような感じです。
  • ShowInTaskbar="False"
    タスクバーに表示しない
  • WindowStyle="None"
    ウィンドウ枠を表示しない。最小化なども表示されなくなります。
  • AllowsTransparency="True"
    透過を許可する
  • Window.MouseLeftButtonDown event で Window.DragMove method する
    マウス左ボタン押下時にウィンドウを移動できるようにする
     xmlns:i="http://schemas.microsoft.com/xaml/behaviors" が必要
  • Window.IsActive の値によって Window.ResizeMode を変更する
    アクティブ状態になったときにサイズ変更用のGripマーカーを表示する
    非アクティブ状態のときは表示しないようにするほうが見栄えがいい
以上です。

MVVM だと xaml.cs にはなるべく手を入れたくないので、 xaml で完結させました。

0 件のコメント:

コメントを投稿