Свойство зависимости ImageSource в пользовательском элементе управления - PullRequest
0 голосов
/ 23 июня 2010

Я создал небольшой пользовательский элемент управления, состоящий из кнопки, содержимое которой представляет собой изображение.Я создал свойство зависимости «ImageSource» в пользовательском элементе управления, чтобы связать его с изображением внутри кнопки.

Однако в XAML, где я поместил экземпляр настройки своего пользовательского элемента управления, это свойство выдает ошибкуво время выполнения:

<ctrl:ImageButton ImageSource="/Resources/Images/Icons/x.png" Command="{Binding Reset}"  DisabledOpacity="0.1"/>

и во время выполнения:

'/ Resources / Images / Icons / x.png' строка не является допустимым значением свойства ImageSource типа 'ImageSource',Тип 'ImageSource' не имеет общедоступного класса TypeConverter.

Затем я создал конвертер:

public class StringToBitmapImage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri((string) value, UriKind.RelativeOrAbsolute));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

, а затем украсил им свое свойство зависимости:

    [TypeConverter(typeof(StringToBitmapImage))]
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register(
        LambdaHelper.GetMemberName<ImageButton>(ib => ib.ImageSource), typeof (ImageSource), typeof (ImageButton));
    [TypeConverter(typeof(StringToBitmapImage))]
    public ImageButton ImageSource
    {
        get { return (ImageButton)GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }

но WPF все равно не преобразует мою строку в экземпляр ImageSource (BitmapImage) ...

Что делать?

1 Ответ

1 голос
/ 23 июня 2010

Здесь есть несколько неправильных вещей:

Во-первых, ваше свойство CLR возвращает ImageButton, тогда как свойство зависимости определяется как ImageSource.

Во-вторых, преобразователь типаэто не то же самое, что конвертер значений привязки.Ваш преобразователь типов должен быть производным от TypeConverter и применяться к классу ImageSource, а не к самому свойству.

В-третьих, тип ImageSource каркаса уже имеет TypeConverterAttribute с ImageSourceConverterконвертер типа, так что все должно работать "из коробки" без необходимости писать собственный конвертер.Убедитесь, что вы не ссылаетесь на другой пользовательский класс ImageSource в другом пространстве имен.

Для завершения используйте ImageBrush.ImageSource.AddOwner вместо переопределения целого нового свойства зависимости.

Редактировать: в ответ на комментарий Беррил:

public static readonly DependencyProperty ImageSourceProperty = ImageBrush.ImageSource.AddOwner(typeof(ImageButton);

Этот фрагмент кода будет использовать существующее свойство ImageSource вместо того, чтобы определять новое (помните, что каждое другое свойство зависимости регистрируется в глобальном статическом словаре), определяя тольконовый владелец и, возможно, новые метаданные.Это как OverrideMetadata, но из внешнего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...