我想在自定义控件中放置一个图像,所以我的generic.xaml如下所示:
<Style TargetType="local:generic">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:generic">
<Grid Background="{TemplateBinding Background}">
<Rectangle>
<Rectangle.Fill>
<SolidColorBrush x:Name="BackgroundBrush" Opacity="0" />
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{TemplateBinding Text}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{TemplateBinding Foreground}"/>
<Image Source="{TemplateBinding Source}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我的Codebehind如下:
public class Generic : Control
{
public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(Uri), typeof(generic), new PropertyMetadata(""));
public Uri Source
{
get { return (Uri)GetValue(generic.ImageUri); }
set { SetValue(generic.ImageUri, value); }
}
public generic()
{
this.DefaultStyleKey = typeof(generic);
}
}
应用程序正在编译正常但在我尝试运行时抛出以下异常:
$exception
{System.Windows.Markup.XamlParseException: System.TypeInitializationException:
The type initializer for 'testCstmCntrl.themes.generic' threw an exception. ---> System.ArgumentException: Default value type does not match type of property.
谢谢, Subhen
答案 0 :(得分:0)
您的ProperyMetaData
指定一个空字符串“”作为默认值,但该属性的类型为Uri
而不是String
。请改用new PropertyMetaData(null)
。
这样很容易被绊倒,因为可以使用Xaml中的字符串定义Uri属性。但是,xaml解析器处理字符串到Uri的转换,因为它似乎可以接受将字符串分配给Uri
类型的属性。但它不适用于C#代码。
答案 1 :(得分:0)
现在它正常工作,图像源正在寻找BitmapImage作为源。因此,在获取get方法中的值时,我们必须将Bitmap指定为返回类型。
我们可以通过从dependencyProperty注册名称传递URI来返回位图。
所以现在我的代码如下所示:
public class generic : Control
{
public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(generic), null);
public BitmapImage Source
{
get {
//return (Uri)GetValue(generic.ImageUri);
string strURI =(string) GetValue(generic.ImageUri);
return new BitmapImage(new Uri(strURI));
}
set { SetValue(generic.ImageUri, value); }
}
public generic()
{
this.DefaultStyleKey = typeof(generic);
}
}
感谢您提供的所有建议和支持。