none
RadioButtonのForeColorを変えると例外が発生する RRS feed

  • 質問

  • GroupBox1の中にRadioButtonが3つあり、GroupBox2にはRadioButtonが4つあります。

    構造は

    <GroupBox1>

    WhiteRadioButtonは背景をWhiteにする。GroupBox2の項目のIsEnabledをfalseにする。

    BlackRadioButtonは背景をBlackにする。GroupBox2の項目のIsEnabledをfalseにする。

    WallpaperRadioButtonは背景を選択した壁紙にする。GroupBox2の項目のIsEnabledをtrueにする。

    <GroupBox2>

    noneは(MainWindowの)stretchをNoneにする。

    fillはstretchをFillにする。

    uniformはstretchをUniformにする。

    uniformToFillはstretchをUniformToFillにする。

    こんな感じです。

    そこで、以下のコードを見ていただくとわかると思うのですが、なぜかWhiteRadioButtonの選択したときだけーーーの間のコードを記述すると例外が出てしまいます。

    自分でも色々調べたり考えたりしてみたのですが、原因がよくわかりません...

    原因がわかる方、ご教授くださると幸いです。(なぜか改行ができなくて見にくくなってしまいました…)

    <例外>

    System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation.'

    内部例外

    NullReferenceException: Object reference not set to an instance of an object.

    <コード>

            private void WhiteRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                Background = new SolidColorBrush(Colors.White);
                WhiteRadioButton.Foreground = new SolidColorBrush(Colors.Black);
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
                BlackRadioButton.Foreground = new SolidColorBrush(Colors.White);
                WallpaperRadioButton.Foreground = new SolidColorBrush(Colors.White);
                none.Foreground = new SolidColorBrush(Colors.White);
                fill.Foreground = new SolidColorBrush(Colors.White);
                uniform.Foreground = new SolidColorBrush(Colors.White);
                uniformToFill.Foreground = new SolidColorBrush(Colors.White);
                none.IsEnabled = false;
                fill.IsEnabled = false;
                uniform.IsEnabled = false;
                uniformToFill.IsEnabled = false;
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
            }

            private void BlackRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                Background = new SolidColorBrush(Colors.Black);
                WhiteRadioButton.Foreground = new SolidColorBrush(Colors.White);
                BlackRadioButton.Foreground = new SolidColorBrush(Colors.White);
                WallpaperRadioButton.Foreground = new SolidColorBrush(Colors.White);
                none.Foreground = new SolidColorBrush(Colors.White);
                fill.Foreground = new SolidColorBrush(Colors.White);
                uniform.Foreground = new SolidColorBrush(Colors.White);
                uniformToFill.Foreground = new SolidColorBrush(Colors.White);
                none.IsEnabled = false;
                fill.IsEnabled = false;
                uniform.IsEnabled = false;
                uniformToFill.IsEnabled = false;
            }

            private void WallpaperRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                OpenFileDialog openFileDialog2 = new OpenFileDialog();
                openFileDialog2.Filter = "Image Files|*.jpg;*.png;*.jpeg;*.bmp";
                openFileDialog2.Title = "Select Wallpaper";

                if (openFileDialog2.ShowDialog() == true)
                {
                    ImageBrush imageBrush = new ImageBrush();
                    imageBrush.ImageSource = new BitmapImage(new Uri(openFileDialog2.FileName, UriKind.Relative));
                    Background = imageBrush;

                    WhiteRadioButton.Foreground = new SolidColorBrush(Colors.Black);
                    BlackRadioButton.Foreground = new SolidColorBrush(Colors.Black);
                    WallpaperRadioButton.Foreground = new SolidColorBrush(Colors.Black);
                    none.Foreground = new SolidColorBrush(Colors.Black);
                    fill.Foreground = new SolidColorBrush(Colors.Black);
                    uniform.Foreground = new SolidColorBrush(Colors.Black);
                    uniformToFill.Foreground = new SolidColorBrush(Colors.Black);
                    none.IsEnabled = true;
                    fill.IsEnabled = true;
                    uniform.IsEnabled = true;
                    uniformToFill.IsEnabled = true;
                }
            }



    • 編集済み WPF開発 2018年6月10日 13:08
    2018年6月10日 13:05

回答

  • NullReferenceException ということは、問題のコードの中で変数の値が null になっているものに対してメソッドを呼んだり、プロパティを操作したりするときに発生するのが多いです。

    ところで、ブレークポイントやステップ実行はご存知ですか?
    コードの中で F9 をキーを押すと、その行の色が変わり、実行時にそこを通る度に一時停止状態に変わります。
    そこから、F11 キーでステップイン(1行進める、またはメソッドの中に入る)となりますので、1行ずつ進めて、変な動き(次の行に進まずにどこかに飛ぶ、あるいは例外が起きる)場所を特定してください。

    http://www.atmarkit.co.jp/fdotnet/chushin/vsdebug_01/vsdebug_01_02.html

    メソッドすべてを実行してから、どこかわからないところで例外が出るというケースもあるかもしれません。
    そういった場合はバインディングやスタイルなど、XAML で設定している要素が影響している可能性もあります。

    • 回答としてマーク WPF開発 2018年6月11日 8:11
    2018年6月10日 21:10
  • 確かに3つのラジオボタンとも、その部分に関しては同じコードが記述してあるように見えます。
    そうなると、そこ以外に違いがあるはずです。XAMLとか、もしConverterを使っていればその辺りです。

    エラーも必ず発生するのか、それとも操作順に依存するのか、また、エラーの発生する個所は特定できているのか? 例外の詳細に何かもっと記述されていないか、スタックトレースから何か読み取れないか等、他に手掛かりはありませんしょうか?

    もし、それでもわからない場合は、問題となっている部分のコードを1行ずつコメントアウトし、どの行があると例外が発生するか絞り込んでみると、何かヒントが得られるかもしれません。

    また、ラジオボタン絡みだと、何を選択していない状態にするには、DependencyProperty.UnsetValueをセットしますが、このようにしていないところがあったりしないでしょうか?


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク WPF開発 2018年6月11日 8:11
    2018年6月11日 1:11
    モデレータ

すべての返信

  • NullReferenceException ということは、問題のコードの中で変数の値が null になっているものに対してメソッドを呼んだり、プロパティを操作したりするときに発生するのが多いです。

    ところで、ブレークポイントやステップ実行はご存知ですか?
    コードの中で F9 をキーを押すと、その行の色が変わり、実行時にそこを通る度に一時停止状態に変わります。
    そこから、F11 キーでステップイン(1行進める、またはメソッドの中に入る)となりますので、1行ずつ進めて、変な動き(次の行に進まずにどこかに飛ぶ、あるいは例外が起きる)場所を特定してください。

    http://www.atmarkit.co.jp/fdotnet/chushin/vsdebug_01/vsdebug_01_02.html

    メソッドすべてを実行してから、どこかわからないところで例外が出るというケースもあるかもしれません。
    そういった場合はバインディングやスタイルなど、XAML で設定している要素が影響している可能性もあります。

    • 回答としてマーク WPF開発 2018年6月11日 8:11
    2018年6月10日 21:10
  • 確かに3つのラジオボタンとも、その部分に関しては同じコードが記述してあるように見えます。
    そうなると、そこ以外に違いがあるはずです。XAMLとか、もしConverterを使っていればその辺りです。

    エラーも必ず発生するのか、それとも操作順に依存するのか、また、エラーの発生する個所は特定できているのか? 例外の詳細に何かもっと記述されていないか、スタックトレースから何か読み取れないか等、他に手掛かりはありませんしょうか?

    もし、それでもわからない場合は、問題となっている部分のコードを1行ずつコメントアウトし、どの行があると例外が発生するか絞り込んでみると、何かヒントが得られるかもしれません。

    また、ラジオボタン絡みだと、何を選択していない状態にするには、DependencyProperty.UnsetValueをセットしますが、このようにしていないところがあったりしないでしょうか?


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク WPF開発 2018年6月11日 8:11
    2018年6月11日 1:11
    モデレータ
  • ご回答ありがとうございます。 そのような機能があるのですね… 勉強になりました。 例外の件ですが、以下のコードに変えることでちゃんと動作しました。 if (BlackRadioButton != null) { BlackRadioButton.Foreground = new SolidColorBrush(Colors.Black); } ありがとうございました。
    2018年6月11日 8:16