web-dev-qa-db-ja.com

1つのハンドラーを持つWPFトグルボタンのChecked / Ucheckedイベント

WPFウィンドウでToggleButtonを使用しています:

 <ToggleButton Height="37"
          HorizontalAlignment="Left"
          Margin="485.738,254.419,0,0"
          VerticalAlignment="Top"
          Width="109"
          IsEnabled="True"
          Checked="toggleAPDTimeoutErr_Checked"
          Unchecked="toggleAPDTimeoutErr_Unchecked">Timeout</ToggleButton>

監視している2つのイベントがありますが、これはハンドラの背後にある2つの異なるコードで行われます。これを1つだけで実行するにはどうすればよいですか?

ToggleButtonsはたくさんあり、コードが大きくなる可能性があります。

19
Ryan R

ToggleButtonのシングルクリックイベントをアタッチし、そのハンドラーでToggleButtonIsCheckedプロパティを確認するには、次のようにハンドラーで送信者オブジェクトを型キャストします。

private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
   if((sender as ToggleButton).IsChecked)
   {
      // Code for Checked state
   }
   else
   {
      // Code for Un-Checked state
   }
}

XAML:

<ToggleButton Height="37" HorizontalAlignment="Left" Margin="485.738,254.419,0,0"     VerticalAlignment="Top" Width="109" IsEnabled="True" Click="ToggleButton_Click">Timeout</ToggleButton>
22
Rohit Vats

いくつかの回答が示唆するように、Clickイベントは使用しないでください。プロパティIsCheckedがコードまたはマウス以外のイベント(キーボード、アニメーションなど)によって変更されると機能しません。これは単なるバグです。

代わりに、CheckedUncheckedの両方に同じハンドラーを使用し、IsCheckedプロパティに応じてアクションを実行できます。

<ToggleButton
    Checked="toggleButton_IsCheckedChanged"
    Unchecked="toggleButton_IsCheckedChanged" />
12
Arek

これを試して

private void tBtn_super_Click(object sender, RoutedEventArgs e)
        {
            if (tBtn_super.IsChecked == true)
            {
                MessageBox.Show("True");
            }
            else
            {
                MessageBox.Show("False");
            }
        }
0