WPF - DataBinding ImageSource

Как может я DataBind мое управление Изображением для автоматического получения плеера. Обновления PlayerImage? Как Вы видите из моего кода, я попытался установить привязку данных, однако это не работает.

Ниже моя текущая установка:

Мне назвали класс CLR CDGPlayer это реализует INotifyPropertyChanged.

CDGPlayer классу назвали свойство PlayerImage

private Image playerImage;
public Image PlayerImage
{
    get { return playerImage; }
    set
    {
        if (value != playerImage)
        {
            playerImage = value;
            NotifyPropertyChanged("PlayerImage");
        }
    }
}

У меня есть клиент WPF, что я хотел бы использовать CDGPlayer.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CDG="clr-namespace:GoldenKaraokeLib.CDG;assembly=GoldenKaraokeLib" 
    xmlns:local="clr-namespace:GoldenKaraokePlayerWPF" 
    x:Class="GoldenKaraokePlayerWPF.Window1"
    Title="Window1" Height="300" Width="654"
        x:Name="CDGPlayerHost" Loaded="CdgPlayerHostLoaded" Background="#FFCD6F6F">
    <Window.Resources>
        <local:CdgImageConverter x:Key="CDGImageConverter"/>
    </Window.Resources>
    <Grid>
        <Grid.DataContext>
            <CDG:CDGPlayer x:Name="player"/>
        </Grid.DataContext>
        <Border BorderBrush="Black" BorderThickness="5">
            <Image x:Name="CDGImage" Source="{Binding PlayerImage, Converter={StaticResource CDGImageConverter}, UpdateSourceTrigger=PropertyChanged}"/>
        </Border>
    </Grid>
</Window>

в файле Window1.cs у меня есть a Loaded событие, которое называет экземпляр класса CDGPlayer и вызывает Play метод. Этот метод генерирует новое System.Drawing.Image и хранилища это в PlayerImage.

Я знаю, что свойство CDGImage Source не может принять Систему. Рисование. Изображение, таким образом, я попытался записать сырой преобразователь. Однако это только называют однажды на загрузке окна.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    try
    {
        MemoryStream ms = new MemoryStream();
        Image bitmap = value as Image;
        BitmapImage bi = new BitmapImage();

        if (bitmap != null)
        {
            bitmap.Save(ms, ImageFormat.Bmp);

            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
        }

        return bi;
    }
    catch
    {
        return new BitmapImage();
    }
}

Что я делаю неправильно?

1
задан H.B. 27 September 2011 в 04:49
поделиться

1 ответ

Ваша привязка кажется правильной, когда я пробую ее. Однако похоже, что в вашем конвертере есть ошибка. Вы не перематываете поток, поэтому BitmapImage будет пытаться читать с конца, а не с начала. Добавьте вызов Stream.Seek:

if (bitmap != null)
{
    bitmap.Save(ms, ImageFormat.Bmp);
    ms.Seek(0, SeekOrigin.Begin); // Set position back to the start of the stream
    bi.BeginInit();
    bi.StreamSource = ms;
    bi.EndInit();
}
2
ответ дан 2 September 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: