【问题标题】:WPF - DataBinding ImageSourceWPF - 数据绑定图像源
【发布时间】:2010-07-11 01:40:52
【问题描述】:

如何 DataBind 我的 Image 控件以自动获取 player.PlayerImage 更新?从我的代码中可以看出,我尝试设置数据绑定,但是它不起作用。

以下是我目前的设置:

我有一个名为 CDGPlayer 的 CLR 类,它实现了 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中。

我知道 CDGImage Source 属性不能接受 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();
    }
}

我做错了什么?

【问题讨论】:

    标签: c# wpf xaml data-binding


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 2013-01-11
      • 2017-10-09
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多