首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF - DataBinding ImageSource

WPF - DataBinding ImageSource
EN

Stack Overflow用户
提问于 2010-07-11 09:40:52
回答 1查看 2.7K关注 0票数 1

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

下面是我当前的设置:

我有一个实现INotifyPropertyChanged的名为CDGPlayer的CLR类。

CDGPlayer类具有一个名为PlayerImage的属性

代码语言:javascript
复制
private Image playerImage;
public Image PlayerImage
{
    get { return playerImage; }
    set
    {
        if (value != playerImage)
        {
            playerImage = value;
            NotifyPropertyChanged("PlayerImage");
        }
    }
}

我有一个WPF客户端,我想使用CDGPlayer。

代码语言:javascript
复制
<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文件中,我有一个调用CDGPlayer类实例并调用Play方法的Loaded事件。此方法生成一个新的System.Drawing.Image并将其存储在PlayerImage中。

我知道CDGImage源属性不能接受System.Drawing.Image,所以我尝试编写一个粗糙的转换器。但是,这只在窗口加载时调用一次。

代码语言:javascript
复制
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();
    }
}

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-11 11:03:16

当我尝试时,您的绑定似乎是正确的。不过,看起来你的转换器有一个bug。您不会倒回流,因此BitmapImage将尝试从结尾开始读取,而不是从开头开始。添加对Stream.Seek的调用:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3221522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档