🐦
WinUI3のFlyoutのスタイルを変更する
はじめに
WinUI3のFlyout
のスタイル指定方法が他のコンポーネントに比べて少し特殊だったので備忘録です。結論をお急ぎの方はFlyout自体のスタイルの変更方法セクションへ。
Flyoutとは
WinUI3ではButton
にFlyout
属性を付けることができ、クリック時でポップアップ(Flyout)が表示されるようにできます。しかもXAMLだけの実装でOK。
<Button>
Additional Info1
<Button.Flyout>
<Flyout Placement="Bottom">
<TextBlock TextWrapping="WrapWholeWords">
こんにちは 🎉
</TextBlock>
</Flyout>
</Button.Flyout>
</Button>
デフォルトスタイルの問題点
大変便利なのですが、下記のように長い文章を表示させようとすると、TextWrapping
を有効にしていても改行されずに横スクロールされてしまいます。
また、Flyout
のContent
でレイアウト系のコンポーネントを入れて幅を固定させようとしても、Flyout
自体の幅は特定の幅までしか広がらず、スクロールバーに変わってしまいます。
Flyout自体のスタイルの変更方法
実はFlyout
自体はコントロールやUIElementでは無いのでStyle適用のためのプロパティが存在しません[1]。代わりにFlyout
のコンテンツ表示を担当するFlyoutPresenter
のスタイルを変更する必要があります。
例えば、下記例では水平スクロールを無効化してテキストをMaxWidth
で折り返すように実装しています。ついでにPadding
も指定しています。
<Button>
Additional Info4
<Button.Flyout>
<Flyout Placement="Bottom">
+ <Flyout.FlyoutPresenterStyle>
+ <Style TargetType="FlyoutPresenter">
+ <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
+ <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
+ <Setter Property="MaxWidth" Value="400" />
+ <Setter Property="Padding" Value="10" />
+ </Style>
+ </Flyout.FlyoutPresenterStyle>
<TextBlock TextWrapping="WrapWholeWords">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
</TextBlock>
</Flyout>
</Button.Flyout>
</Button>
変更可能なプロパティ一覧は下記を参考に。
余談(Backdropの指定)
Flyout
にはSystemBackdrop
プロパティも存在します。下記のように設定することでポップアップの背景をMicaやAcrylicにできるはずです。以前試した際はうまく反映されなかった気がするのですが、一応共有です。
<Button>
Additional Info4
<Button.Flyout>
<Flyout Placement="Bottom">
<Flyout.FlyoutPresenterStyle>
<Style TargetType="FlyoutPresenter">
<Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
<Setter Property="TabNavigation" Value="Cycle" />
<Setter Property="MaxWidth" Value="600" />
<Setter Property="Padding" Value="10" />
</Style>
</Flyout.FlyoutPresenterStyle>
+ <Flyout.SystemBackdrop>
+ <MicaBackdrop />
+ </Flyout.SystemBackdrop>
<TextBlock TextWrapping="WrapWholeWords">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
</TextBlock>
</Flyout>
</Button.Flyout>
</Button>
Discussion