Как назначить Image Uri в пользовательском элементе управления - PullRequest
1 голос
/ 15 апреля 2010

Я хочу поместить изображение в свой пользовательский элемент управления, поэтому мой файл 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>

Мой кодекс выглядит следующим образом:

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

Apllication прекрасно компилируется, но пока я пытаюсь его запустить, выдается следующее исключение:

$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 голосов
/ 15 апреля 2010

Теперь все работает, источник изображения ищет BitmapImage в качестве источника. Поэтому, получая значение в нашем методе get, мы должны указать Bitmap в качестве возвращаемого типа.

Мы можем вернуть растровое изображение, передав наш URI из зарегистрированного имени dependencyProperty.

Так что теперь мой код выглядит следующим образом:

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

Спасибо за все ваши предложения и поддержку.

0 голосов
/ 15 апреля 2010

Ваш ProperyMetaData указывает пустую строку "" в качестве значения по умолчанию, но свойство имеет тип Uri, а не String. Вместо этого используйте new PropertyMetaData(null).

Его легко отключить, потому что свойства Uri могут быть определены с помощью строк в Xaml. Однако синтаксический анализатор xaml обрабатывает преобразование строки в Uri, поскольку вы делаете так, как будто можно присвоить строку для типизированного свойства Uri. Однако это не то, что будет работать в коде C #.

...