2011-08-10 184 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中)的圖像?如果是這樣,它的「構建行爲」屬性設置爲「資源」?

相關問題