2011-08-10 137 views
0

我尝试制作图像按钮用户控件。但是,当我在窗口初始化设置图像,然后抛出此异常。这里是我的代码未将对象引用设置为对象的实例

考试。

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

请告诉我我错在哪里。请为我提供一个示例。 感谢您的帮助。

+1

使用您的调试器...设置断点并查看哪个对象为空 –

回答

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或你可能 hav一个InvalidCastException - 突然之间你有更多关于什么是错的信息。

一个演员在这里更好,因为你总是期待FindName返回Image,不是吗?如果这是类型转换失败的错误条件,那么当它适用于表达式而非为目标类型并且您打算单独处理该情况时,应该使用强制转换使用as

0

简单的猜测,但是你添加到你的项目中包含的按钮(在Visual Studio中)的图像?如果是这样,它的“构建行为”属性设置为“资源”?

相关问题