locked
TextBlockの文字色変更 RRS feed

  • 質問

  • C#にてラジオボタンが選択された際にTextBlockの文字色を変更したいのですが、以下のコード

    textBlock2.Foreground = new SolidColorBrush(Colors.White);

    を実行したところ、「NullReferenceException はハンドルされませんでした。」という例外が発生してしまいました。

    どのようなコードにすればTextBlockの文字色が変更できるのでしょうか。

    よろしくお願いいたします。

    • 移動 Mike Wang (MSCS) 2012年10月2日 11:11 (移動元:Windows Phone 7 向けの開発)
    2012年9月2日 2:02

回答

  • とりあえず、RadioButtonで選択状態が変わった際に文字色を変更するサンプルを作ってみました。

    <phone:PhoneApplicationPage 
        x:Class="PhoneApp1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <StackPanel Orientation="Vertical">
            <TextBlock Name="textBlock" Text="さんぷる" />
    
            <RadioButton Content="項目1" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
            <RadioButton Content="項目2" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
            <RadioButton Content="項目3" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
        </StackPanel>
    
    </phone:PhoneApplicationPage>
        public partial class MainPage : PhoneApplicationPage
        {
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void OnChecked(object sender, RoutedEventArgs e)
            {
                RadioButton radioButton = (RadioButton)sender;
                radioButton.Foreground = new SolidColorBrush(Colors.Red);
    
                ChangeColor(radioButton);
            }
    
            private void OnUnchecked(object sender, RoutedEventArgs e)
            {
                RadioButton radioButton = (RadioButton)sender;
                radioButton.Foreground = new SolidColorBrush(Colors.White);
            }
    
            private void ChangeColor(RadioButton radioButton)
            {
                switch ((string)radioButton.Content)
                { 
                    case "項目1":
                        textBlock.Foreground = new SolidColorBrush(Colors.Red);
                        break;
    
                    case "項目2":
                        textBlock.Foreground = new SolidColorBrush(Colors.Blue);
                        break;
    
                    case "項目3":
                        textBlock.Foreground = new SolidColorBrush(Colors.Green);
                        break;
    
                    default:
                        textBlock.Foreground = new SolidColorBrush(Colors.White);
                        break;
                }
            }
        }

    で、その上で

    >> textBlock2.Foreground = new SolidColorBrush(Colors.White);
    >> を実行したところ、「NullReferenceException はハンドルされませんでした。」という例外が発生してしまいました。

    コードの全体像が無いので推測でしかないのですが、Null参照エラーですのでtextBlock2コントロールがまだインスタンスされていないタイミング(例えばInitializeComponentの前とか・・・)でこの処理が実行されているのではないでしょうか?
    上記のサンプルからも分かるとおり、書き方そのものは問題ないと思います。

    • 回答としてマーク Suuei1 2012年9月6日 13:37
    2012年9月4日 5:58

すべての返信

  • とりあえず、RadioButtonで選択状態が変わった際に文字色を変更するサンプルを作ってみました。

    <phone:PhoneApplicationPage 
        x:Class="PhoneApp1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <StackPanel Orientation="Vertical">
            <TextBlock Name="textBlock" Text="さんぷる" />
    
            <RadioButton Content="項目1" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
            <RadioButton Content="項目2" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
            <RadioButton Content="項目3" GroupName="Group1" Checked="OnChecked" Unchecked="OnUnchecked" />
        </StackPanel>
    
    </phone:PhoneApplicationPage>
        public partial class MainPage : PhoneApplicationPage
        {
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void OnChecked(object sender, RoutedEventArgs e)
            {
                RadioButton radioButton = (RadioButton)sender;
                radioButton.Foreground = new SolidColorBrush(Colors.Red);
    
                ChangeColor(radioButton);
            }
    
            private void OnUnchecked(object sender, RoutedEventArgs e)
            {
                RadioButton radioButton = (RadioButton)sender;
                radioButton.Foreground = new SolidColorBrush(Colors.White);
            }
    
            private void ChangeColor(RadioButton radioButton)
            {
                switch ((string)radioButton.Content)
                { 
                    case "項目1":
                        textBlock.Foreground = new SolidColorBrush(Colors.Red);
                        break;
    
                    case "項目2":
                        textBlock.Foreground = new SolidColorBrush(Colors.Blue);
                        break;
    
                    case "項目3":
                        textBlock.Foreground = new SolidColorBrush(Colors.Green);
                        break;
    
                    default:
                        textBlock.Foreground = new SolidColorBrush(Colors.White);
                        break;
                }
            }
        }

    で、その上で

    >> textBlock2.Foreground = new SolidColorBrush(Colors.White);
    >> を実行したところ、「NullReferenceException はハンドルされませんでした。」という例外が発生してしまいました。

    コードの全体像が無いので推測でしかないのですが、Null参照エラーですのでtextBlock2コントロールがまだインスタンスされていないタイミング(例えばInitializeComponentの前とか・・・)でこの処理が実行されているのではないでしょうか?
    上記のサンプルからも分かるとおり、書き方そのものは問題ないと思います。

    • 回答としてマーク Suuei1 2012年9月6日 13:37
    2012年9月4日 5:58
  • 回答ありがとうございます。

    ご指摘の通り、インスタンスの前にコードが実行されていました。

    また、サンプルコードにて、

    switch ((string)radioButton.Content)

    ということができることを知り、大変参考になりました。

    次回から質問するときにはコードの全体像がわかるよう、問題のコードだけでなく他のコードもあわせて質問をさせていただこうと思います。

    ありがとうございました。

    2012年9月6日 13:50