トップ回答者
RadioButtonのForeColorを変えると例外が発生する

質問
-
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
回答
-
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
-
確かに3つのラジオボタンとも、その部分に関しては同じコードが記述してあるように見えます。
そうなると、そこ以外に違いがあるはずです。XAMLとか、もしConverterを使っていればその辺りです。
エラーも必ず発生するのか、それとも操作順に依存するのか、また、エラーの発生する個所は特定できているのか? 例外の詳細に何かもっと記述されていないか、スタックトレースから何か読み取れないか等、他に手掛かりはありませんしょうか?
もし、それでもわからない場合は、問題となっている部分のコードを1行ずつコメントアウトし、どの行があると例外が発生するか絞り込んでみると、何かヒントが得られるかもしれません。
また、ラジオボタン絡みだと、何を選択していない状態にするには、DependencyProperty.UnsetValueをセットしますが、このようにしていないところがあったりしないでしょうか?
★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 回答としてマーク WPF開発 2018年6月11日 8: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
-
確かに3つのラジオボタンとも、その部分に関しては同じコードが記述してあるように見えます。
そうなると、そこ以外に違いがあるはずです。XAMLとか、もしConverterを使っていればその辺りです。
エラーも必ず発生するのか、それとも操作順に依存するのか、また、エラーの発生する個所は特定できているのか? 例外の詳細に何かもっと記述されていないか、スタックトレースから何か読み取れないか等、他に手掛かりはありませんしょうか?
もし、それでもわからない場合は、問題となっている部分のコードを1行ずつコメントアウトし、どの行があると例外が発生するか絞り込んでみると、何かヒントが得られるかもしれません。
また、ラジオボタン絡みだと、何を選択していない状態にするには、DependencyProperty.UnsetValueをセットしますが、このようにしていないところがあったりしないでしょうか?
★良い回答には質問者は回答済みマークを、閲覧者は投票を!
- 回答としてマーク WPF開発 2018年6月11日 8:11