WPF - DataBinding ImageSource - PullRequest
       2

WPF - DataBinding ImageSource

1 голос
/ 11 июля 2010

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

Ниже приведены мои текущие настройки:

У меня есть класс 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 У меня есть событие Loaded, которое вызывает экземпляр класса CDGPlayer и вызывает метод Play.Этот метод генерирует новый System.Drawing.Image и сохраняет его в PlayerImage.

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

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 Ответ

2 голосов
/ 11 июля 2010

Ваша привязка кажется правильной, когда я ее пробую.Похоже, что в вашем конвертере есть ошибка.Вы не перематываете поток, поэтому 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...