Как разработать свойство зависимостей WPF для поддержки пути к изображению? - PullRequest
3 голосов
/ 11 ноября 2009

Чтобы описать мою проблему, я создал небольшое приложение. Сначала Usercontrol:

<UserControl x:Class="WpfApplication10.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="This" DataContext="{Binding ElementName=This}"
    >    
    <Image Source="{Binding Path=MyImageSource}" ></Image>
</UserControl>

второй TestApp:

<Window x:Class="WpfApplication10.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication10="clr-namespace:WpfApplication10"
    Title="Window1" Height="300" Width="300">
    <WpfApplication10:UserControl1
        MyImageSource="c:\test.png" >        
    </WpfApplication10:UserControl1>
</Window>

третий код за пользовательским контролем

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace WpfApplication10
{
    public partial class UserControl1 : UserControl
    {
        public static readonly DependencyProperty MyImageSourceProperty =
            DependencyProperty.Register("MyImageSource", 
                 typeof(BitmapImage),typeof(UserControl1),
                 new FrameworkPropertyMetadata((BitmapImage)new BitmapImage(),
                      FrameworkPropertyMetadataOptions.None
                 ));

        public BitmapImage MyImageSource
        {
            get { return (BitmapImage)GetValue(MyImageSourceProperty); }
            set { SetValue(MyImageSourceProperty, value); }
        }


        public UserControl1()
        {
            InitializeComponent();
        }
    }
}

Я знаю, что тип BitMapImage (из DP) не работает таким образом, но я хочу знать, как реализовать эту функцию чистым, сохраняющим тип способом. Я хочу достичь того же поведения, что и в исходной реализации Image.Source.

спасибо заранее, Скотт

Ответы [ 3 ]

4 голосов
/ 11 ноября 2009

В вашем контроле назовите ваше изображение как:

<Image x:Name="someImage" Source="{Binding Path=MyImageSource}" ></Image>

Реализуйте свойство зависимости как Uri:

public static readonly DependencyProperty MyImageSourceProperty =
    DependencyProperty.Register("MyImageSource", 
        typeof(Uri),typeof(UserControl1),
        new FrameworkPropertyMetadata(new PropertyChangedCallback(OnImageSourceChanged)));

И в OnImageSourceChanged:

private static void OnImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    UserControl1 userControl = (UserControl1)sender;

    userControl.someImage.Source = new BitmapImage((Uri) e.NewValue);
}

Таким образом, вы можете указать строковый путь к свойству зависимости, которое будет автоматически преобразовано в Uri.

EDIT: В Image свойство source реализовано как ImageSource вместо Uri (абстрактный класс, из которого также вытекает ваша реализация, т.е. BitmapSource). Он также реализует событие OnSourceChanged так же, как я реализовал событие для Uri. Вывод таков: вам нужно будет использовать событие изменения, если вы хотите установить источник изображения.

1 голос
/ 11 ноября 2009

Вам необходимо создать конвертер. поскольку ваш DP определен как Bitmapimage, а в XAML вы связываете его со строкой.

Может быть, вы можете найти подходящий конвертер здесь. http://www.codeplex.com/wpfconverters

или попробуйте гуглить "Конвертеры WPF"

public object Convert(object value, Type targetType,
                      object parameter, CultureInfo culture)
{
    try
    {
        return new BitmapImage(new Uri((string)value));
    }
    catch 
    {
        return new BitmapImage();
    }
}

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

}

и пусть ваш MyImageSource будет typeof string. Затем вы можете использовать конвертер внутри определения UserControl.

0 голосов
/ 22 марта 2016

сделать свойство MyImageSource типа string не BitmapImage

public static readonly DependencyProperty MyImageSourceProperty =
        DependencyProperty.Register("MyImageSource", 
             typeof(string),typeof(UserControl1),
new FrameworkPropertyMetadata(OnImageSourcePathChanged));

    public string MyImageSource
    {
        get { return (BitmapImage)GetValue(MyImageSourceProperty); }
        set { SetValue(MyImageSourceProperty, value); }
    }

 private static void OnImageSourcePathChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((UserControl1)d).MyImageSource.Source = new BitmapImage(new Uri(e.NewValue as string));

    }

использование:

<WpfApplication10:UserControl1 MyImageSource="c:\test.png" > </WpfApplication10:UserControl1>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...