左クリックでFlyoutを表示できるToggleボタンを作る

WInUI3関連記事

https://tera1707.com/entry/2022/02/06/144447#WinUI3

やりたいこと

普通のボタン(Microsoft.UI.Xaml.Controls.Button)にはFlyoutプロパティがあって、そこにFlyoutを入れてやると、 クリックしたときにフライアウトを出すことができる。

今回、トグルボタン(Microsoft.UI.Xaml.Controls.ToggleButton)でもクリックしたときにフライアウトを出したいのだが、トグルボタンには Flyoutプロパティがなく、右クリックしたときに出るFlyoutをセットするためのContextFlyoutしかない。

ContextFlyoutをうまく使って、普通の(左クリックして出る)Flyoutっぽく動かせないか、やってみる。

追記(22/05/27)

もっと、正攻法なやり方があった。
下記を参照。

https://tera1707.com/entry/2022/05/27/012034

前提

  • VisualStudio2022 Community 17.1.4
  • WinUI3
  • Windows App SDK 1.0

やり方

下記のような感じでやってみた。

  • ToggleButtonを継承したクラスを作成し、
    • OnToggle()をオーバーライドして、親クラスのOnToggleの処理(base.OnToggle())を行わないようにすることで、通常のToggleボタンを左クリックしたときのトグル(ONになったりOFFになったりする)動作が行われないようにする。
    • 代わりに、OnToggle()では、ContextFlyoutを自分の場所に表示する処理を行う。
    • Toggle動作はFlyoutの中に入っているRadioButtonのONOFFを見て行うようにする。
  • 画面のxamlでは、作ったクラスのContextFlyoutに、出したいフライアウトをセットしておく。

サンプルコード

フライアウトできるトグルボタンのコード

public class FlyoutToggleButton : ToggleButton
{
    protected override void OnToggle()
    {
        //base.OnToggle();
        this.ContextFlyout.ShowAt(this);
    }
}

それを使う画面

<Grid>
    <local:FlyoutToggleButton Content="クリック時にFlyoutを出せるトグルボタン"
                              IsChecked="{Binding IsChecked, ElementName=radio1}">
        <local:FlyoutToggleButton.ContextFlyout>
            <Flyout>
                <StackPanel>
                    <RadioButton x:Name="radio1" Content="選択1"/>
                    <RadioButton x:Name="radio2" Content="選択2"/>
                </StackPanel>
            </Flyout>
        </local:FlyoutToggleButton.ContextFlyout>
    </local:FlyoutToggleButton>
</Grid>

動作イメージ

参照

Button

docs.microsoft.com

ToggleButton

https://docs.microsoft.com/en-us/windows/winui/api/microsoft.ui.xaml.controls.primitives.togglebutton?view=winui-3.0docs.microsoft.com

参考書

WinUI3

WinUI3でアプリを作ろうと思ったときのとっかかりによかった。 msdocsに書いてある情報を、体系的に、順番に読みたいな、というときによいかも。(ただし英語)
この本で分からなかった、かゆいところに手が届かなかった部分を私は記事にしてる感じ。

C#①

表紙に書いてある通り、教科書として最適。 これからC#を勉強したいけど、ネットだけで勉強するのは効率が悪いから体系的に学べる本が欲しいときや、 ちょっとC#を勉強してコード書けるようになったけど、もう少し広く深く知りたいなというときによいと思う。
私は仕事で触れるコードを軸に、基本ネットで断片的にC#を学んだので、その知識の隙間を埋めて枝葉を広げるためにとても分かりやすかった。

C#②

C#の文法的に色々できるのは分かったが、いざ実装するときに、わかったことを使ってどう実装すればいいのか?と悩んだときに指針になりそうな本。
「プロパティ等の名前の付け方、どうすればいい?」「情報をクラス外部に見せるときに、プロパティにすべき?メソッドにすべき?」「異常だと判定したいとき、どんなときにどんな例外をスローすべき?」などなど、勉強になる部分が山ほどあった。
私のように「コードは書くけどこれであってるのか自信がない、レビューで指摘されるのが嫌だ、実装時の(心の)よりどころが欲しい」という人に最適。