如何在自定义控件中分配Image Uri

时间:2010-04-15 11:51:29

标签: silverlight silverlight-3.0 custom-controls

我想在自定义控件中放置一个图像,所以我的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

2 个答案:

答案 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);
        }
    }

感谢您提供的所有建议和支持。