C# 对象引用未设置为对象的实例
我正在尝试制作一个图像按钮用户控件。但当我在窗口初始化时设置图像,然后抛出这个异常。这是我的密码 考试 请告诉我哪里错了。请给我举个例子。C# 对象引用未设置为对象的实例,c#,wpf,xaml,user-controls,controls,C#,Wpf,Xaml,User Controls,Controls,我正在尝试制作一个图像按钮用户控件。但当我在窗口初始化时设置图像,然后抛出这个异常。这是我的密码 考试 请告诉我哪里错了。请给我举个例子。 谢谢你的帮助。首先,我要扩展这个属性——目前每个语句都相当复杂。以下是扩展版本: public ImageSource ButtonImage { get { var template = ProcestaImageButton.Template .FindNa
谢谢你的帮助。首先,我要扩展这个属性——目前每个语句都相当复杂。以下是扩展版本:
public ImageSource ButtonImage
{
get
{
var template = ProcestaImageButton.Template
.FindName("ButtonImage", ProcestaImageButton);
var image = template as Image;
return image.Source;
}
set
{
var template = ProcestaImageButton.Template
.FindName("ButtonImage", ProcestaImageButton);
var image = template as Image;
image.Source = value;
}
}
然后,我可能会将公共代码提取到助手属性:
private Image ProcestaImageButtonImage
{
get
{
var template = ProcestaImageButton.Template
FindName("ButtonImage", ProcestaImageButton);
return template as Image;
}
}
public ImageSource ButtonImage
{
get { return ProcestaImageButtonImage.Source; }
set { ProcestaImageButtonImage.Source = value; }
}
接下来,我将把更改为
转换为cast:
private Image ProcestaImageButtonImage
{
get
{
var template = ProcestaImageButton.Template
.FindName("ButtonImage", ProcestaImageButton);
return (Image) template;
}
}
public ImageSource ButtonImage
{
get { return ProcestaImageButtonImage.Source; }
set { ProcestaImageButtonImage.Source = value; }
}
此时,您可能仍然有一个NullReferenceException
,或者您可能有一个InvalidCastException
——突然,您有了更多关于错误的信息
这里的强制转换更好,因为您总是希望
FindName
返回图像
,不是吗?如果类型转换失败是一个错误条件,那么当表达式不属于目标类型且您打算单独处理该情况时,您应该使用强制转换-仅使用as
。简单猜测,但是您要添加到按钮中的图像是否包含在项目中(在visual studio中)?如果是这样,它的“build action”属性是否设置为“resource”?使用调试器…设置一个断点,查看哪个对象为空
private Image ProcestaImageButtonImage
{
get
{
var template = ProcestaImageButton.Template
FindName("ButtonImage", ProcestaImageButton);
return template as Image;
}
}
public ImageSource ButtonImage
{
get { return ProcestaImageButtonImage.Source; }
set { ProcestaImageButtonImage.Source = value; }
}
private Image ProcestaImageButtonImage
{
get
{
var template = ProcestaImageButton.Template
.FindName("ButtonImage", ProcestaImageButton);
return (Image) template;
}
}
public ImageSource ButtonImage
{
get { return ProcestaImageButtonImage.Source; }
set { ProcestaImageButtonImage.Source = value; }
}