1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[wpf] ボタンのIsDefault・IsCancelを設定する

Last updated at Posted at 2020-10-10

はじめに

仕事でOKボタンを押したらシャットダウンする自作windowを作る機会があったのですが、
windowが表示されたときにEnterキー押したら、OKボタンのクリックイベントが実行されるようにしてね」と言われました。
image.png

言われるまではクリックでok等のボタンイベントが正常か確認していましたが、キーイベントでの挙動は見ていなかったのでこの機会に少しまとめてみました。

IsDefaultIsCancelという便利なプロパティがwpfのボタンには存在するようなので、それを使ってみます。

作ったサンプル

image.png

テキストボックスを1つと、ボタンを5つ並べました。

default(okCancel)と書かれたボタンにIsDefault=Trueを割り当て、escape(ync)と書かれたボタンにIsCancel=Trueを割り当てています。

各ボタンにはクリックイベントを割り当てていて、show NodDefWin以外はメッセージボックスを表示させています。

xaml

<Grid Background="#b33e5c">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid Grid.ColumnSpan="3">
            <TextBlock x:Name="text" Text="result" />
        </Grid>
        
        <!--Defaultのボタン-->
        <Grid Grid.Column="0">
            <Button Content="default(okCancel)" Width="100" Height="30" Click="Button_Default" IsDefault="True" />
        </Grid>

        <Grid Grid.Column="1">
            <StackPanel>
                <!--Escape時に選択されるボタン-->
                <Button Content="escape(ync)" Width="100" Height="30" IsCancel="True" Click="Button_Escape" />
                <Button Content="onlyOk" Width="100" Height="30" Click="Button_OnlyOK" />
                <Button Content="YsNo" Width="100" Height="30" Click="Button_YesNo" />
            </StackPanel>
        </Grid>

        <Grid Grid.Column="2">
            <Button Content="show NoDefWin" Width="100" Height="30" Click="Button_Custom" />
        </Grid>
    </Grid>

xaml.cs

private void Button_Default(object sender, RoutedEventArgs e)
        {
            var r = MessageBox.Show("Enter default ok", "caption", MessageBoxButton.OKCancel);
            this.text.Text = r.ToString();
        }

        private void Button_Escape(object sender, RoutedEventArgs e)
        {
            var r = MessageBox.Show("Enter", "caption", MessageBoxButton.YesNoCancel);
            this.text.Text = r.ToString();
        }

        private void Button_OnlyOK(object sender, RoutedEventArgs e)
        {
            var r = MessageBox.Show("Enter", "caption", MessageBoxButton.OK);
            this.text.Text = r.ToString();
        }

        private void Button_YesNo(object sender, RoutedEventArgs e)
        {
            var r = MessageBox.Show("Enter", "caption", MessageBoxButton.YesNo);
            this.text.Text = r.ToString();
        }

        /// 自作のwindowクラスを表示する
        private void Button_Custom(object sender, RoutedEventArgs e)
        {
            var s = new SubWindow();
            s.ShowDialog();
        }

動作

Enterキー

default(okCancel) と書かれたボタンの IsDefault=True にしているので、アプリ起動時にEnterを押すとこのボタンのClickイベントが実行されて、MessageBoxButton.OKCancelのメッセージボックスが表示されます。

image.png

MessageBoxButton.OKCancelのメッセージボックスは OKボタンがIsDefault=TrueキャンセルボタンがIsCancel=Trueになっています。
ですので、Enterを押すとテキストブロックにOKが表示され、Escapeを押すとCancelが表示されます。

image.png

テキストブロックの文字がCancelになっていますね。

escapeキー

escapeキーを押すと IsCancel=trueにしているescape(ync)を表示しているボタンのclickイベントが実行されます。

image.png

MessageBoxButton.YesNoCancel で表示しているメッセージボックスも デフォルトでYesEscapeでCancelが選択されるようです。

OKのみ / YesNo

MessageBoxButton.OKのメッセージボックスは デフォルト・Escape共にtrueのようで、Enter・escapeどちらでもokが選択されます。

MessageBoxButton.YesNoのメッセージボックスは デフォルトでyesが選択されるようですが、Escapeでは反応がありません。

IsCancelというプロパティ名なので、キャンセルボタンがない場合は基本的にはtrueにしないほうがいいようです。

image.png

escapeを押してもcloseしてくれないメッセージボックス。

show NoDefWin(自作window)

show NodefWinボタンで表示する自作windowはボタンを2つ並べているwindowです。

<!--一部のみ-->
<Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Text="okでシャットダウンします" />

        <Grid Grid.Column="0">
            <Button Content="ok" Width="100" Height="30" Click="Button_Close"/>

        </Grid>

        <Grid Grid.Column="1">
            <Button Content="cancel" Width="100" Height="30" Click="Button_Close"/>
        </Grid>

Button_Closeイベントはthis.Close()のみです。

image.png

IsDefaultもIsCancelもtrueにしていないので、**Enter・Escapeキーを押しても反応がありません。**まぁ、当然ですね。

ということで自作windowでOK・キャンセルボタンを設置するときはIsDefaultIsCancelプロパティを使ってあげようというお話でした。

まとめ

windowsの仕様に倣うのであれば、okタイプのボタンならDefault=Trueにして、キャンセルのボタンならIsCancel=Trueにしたほうがいいと改めて感じました。

・・・評価仕様でこういう確認見たことないな。

参考サイト

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?