使用Button抛出NullReferenceException;我错过了什么吗?

时间:2014-03-20 13:45:31

标签: c# windows-8

我收到错误Object reference not set to an instance of an object。我想我不会初始化一些东西。

这是代码;错误在第if (btn.Background.Equals(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))))行:

private void vbOpenGuiaMaestro_Tapped(object sender, TappedRoutedEventArgs e)
{
    Button btn = default(Button);
    if (btn.Background.Equals(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))))
    {
         btn.Background = materiaColor;
         btn.Foreground = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255));
         stckTeachersGuideClosed.Visibility = Visibility.Visible;
         stckTeachersGuideOpened.Visibility = Visibility.Collapsed;
    }
    else
    {
         btn.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
         btn.Foreground = new SolidColorBrush(Color.FromArgb(255, 140, 140, 140));
    }
 }

4 个答案:

答案 0 :(得分:6)

default(Button)

为您提供null,因为Button是引用类型。我想你想要

Button btn = (Button)sender;

答案 1 :(得分:1)

问题是您的发件人是StackPanel ,并且您正在将其投射到Button。错!

StackPanel stackPanel = sender as StackPanel;
if(stackPanel != null)
{
        if (stackPanel.Background.Equals(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))))
        {
            stackPanel.Background = materiaColor;               
            stckTeachersGuideClosed.Visibility = Visibility.Visible;
            stckTeachersGuideOpened.Visibility = Visibility.Collapsed;
        }
        else
        {
            stackPanel.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
        }
}

答案 2 :(得分:0)

您的错误在Button btn = default(Button);。这是将按钮设置为null,因为这是该类的默认值。

您应该将sender对象转换为Button,然后验证sender不为空(如果事件不是由按钮生成的话)。

var btn = sender as Button;
if (btn != null)
{
    ...
}

答案 3 :(得分:0)

sender对象中,您可以引用触发此事件的UI上的控件。它是对象类型,但您可以将其强制转换为所需类型(在本例中为Button)。

所以得到这样的按钮的引用:

var btn = (Button) sender;

或者,您也可以使用:

var btn = sender as Button;

不同之处在于,在第一种情况下,如果演员阵容不成功,它会给你一个InvalidCastException。在第二种方式中,即使您指定的类型不是预期的类型,它也将默默地尝试转换它,但是当对象被滥用时会进一步崩溃。