Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象引用未设置为对象的实例_C#_Wpf_Xaml_User Controls_Controls - Fatal编程技术网

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; }
}