BETA

WPFのResizeGripが機能しないやん

投稿日:2019-12-22
最終更新:2019-12-22

みんな大好きResizeGrip。
そうWindowの右下にあるあれ。
みんな毎日親の顔より見ているやつです。

今日も世界中でたくさんの人がこれをつかんでウィンドウをリサイズしていることでしょう。

さて、毎日黙々と仕事をこなすResizeGrip君ですが、カスタムウィンドウではうまく機能しないことがあります。
その場合にはStyleをうまいこと設定してやれば動きますよという内容の記事です。

WPFでResizeGripを利用する場合、WindowクラスのResizeModeプロパティをCanResizeWithGripに設定します。
あとは標準で動いてくれます。以上です。

ところが、Nugetやらなんやらで独自スタイルのウィンドウを利用する場合、上記設定だけでは機能しないことがあります。
たとえば、Fluentデザインを実現しちゃうクールなライブラリFluentWPFを適用してみましょう。
使い方は簡単、添付プロパティAcrylicWindow.EnabledTrueにするだけです。

<Window x:Class="WpfApp9.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:fw="clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF"  
        xmlns:local="clr-namespace:WpfApp9"  
        mc:Ignorable="d"  
        fw:AcrylicWindow.Enabled="True"  
        Title="MainWindow"  
        Height="450"  
        Width="800"  
        ResizeMode="CanResizeWithGrip">  
    <Grid>  

    </Grid>  
</Window>  

すると…
おしゃれなAcrylicスタイルのウィンドウが表示されます。

ResizeGripも表示されているので、機能してくれそうですが実際にはリサイズできません。
(マウスカーソルを、ResizeGripに重ねてドラッグしてもリサイズ処理されない)
しょうがないので、ResourcesResizeGripStyleを定義してあげます。
これまた簡単で添付プロパティWindowChrome.ResizeGripDirectionBottomRightにするだけです。これで万事解決!

<Window x:Class="WpfApp9.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:fw="clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF"  
        xmlns:local="clr-namespace:WpfApp9"  
        mc:Ignorable="d"  
        fw:AcrylicWindow.Enabled="True"  
        Title="MainWindow"  
        Height="450"  
        Width="800"  
        ResizeMode="CanResizeWithGrip">  

    <Window.Resources>  
        <Style TargetType="ResizeGrip">  
            <Setter Property="WindowChrome.ResizeGripDirection" Value="BottomRight"/>  
        </Style>  
    </Window.Resources>  

    <Grid>  

    </Grid>  
</Window>  

FluentWPFに限らず、WPFのサードパーティUIコンポーネントを使うと、たまにResizeGripが反応してくれないライブラリがあります。
そういった場合には、上記のようにStyleを定義してやりましょう。

ちなみに私は最近になって、このWindowChrome.ResizeGripDirectionの存在を知りました。
それまではコードビハインドでゴリゴリ処理してました…

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

OGAの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう