我尝试制作图像按钮用户控件。但是当我在窗口初始化时设置图像然后抛出此异常。这是我的代码
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; }
}
请告诉我哪里错了。请给我举个例子。 谢谢你的帮助。
答案 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中)?如果是这样,它的“构建动作”属性是否设置为“资源”?