TextBlockの文字色変更

Category: windows phone devtool_ja

Question

Suuei1 on Sun, 02 Sep 2012 02:02:03


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

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

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

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

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

Replies

みっと on Tue, 04 Sep 2012 05:58:29


とりあえず、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 on Thu, 06 Sep 2012 13:50:44


回答ありがとうございます。

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

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

switch ((string)radioButton.Content)

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

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

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