你调用的对象是空的

时间:2011-08-10 17:31:42

标签: c# wpf xaml user-controls controls

我尝试制作图像按钮用户控件。但是当我在窗口初始化时设置图像然后抛出此异常。这是我的代码

EXAM。

<UserControl.Resources>
    <Style x:Key="ImageButton" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <StackPanel>
                        <Image x:Name="ButtonImage" Stretch="None"/>
                        <ContentPresenter Margin="0,8,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="True"/>
                        <Trigger Property="IsDefaulted" Value="True"/>
                        <Trigger Property="IsMouseOver" Value="True"/>
                        <Trigger Property="IsPressed" Value="True"/>
                        <Trigger Property="IsEnabled" Value="False"/>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Button x:Name="ProcestaImageButton" Content="TextBlock" Style="{DynamicResource ImageButton}"/>

C#代码。

    public ImageSource ButtonImage
    {
        get { return ((this.ProcestaImageButton.Template).FindName("ButtonImage", this.ProcestaImageButton) as Image).Source; }
        set { ((this.ProcestaImageButton.Template).FindName("ButtonImage", this.ProcestaImageButton) as Image).Source = value; }
    }

请告诉我哪里错了。请给我举个例子。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

首先,我要扩展该属性 - 目前每个语句都相当复杂。这是扩展版本:

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

接下来我会将as更改为演员:

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返回Image,不是吗?如果类型转换失败是一个错误条件,那么当它对表达式而不是有效时,你应该使用强制使用as,而你是打算单独处理这个案子。

答案 1 :(得分:0)

简单猜测,但是您添加到项目中的按钮的图像(在visual studio中)?如果是这样,它的“构建动作”属性是否设置为“资源”?