0

我想在我的 WPF 窗口中显示图像。我已经把这段代码这样做了。

<Image  x:Name="ImageControl" Stretch="Fill" Margin="2" Source="{Binding imgSource}"/>

在我后面的代码中,

    public ImageSource imgSource
    {
        get
        {
            logo = new BitmapImage();
            logo.BeginInit();
            logo.UriSource = new Uri(@"C:\MyFolder\Icon.jpg");
            logo.EndInit();                
            return logo;
        }
    }

此代码显示图像很好,但我也应该能够更改图像运行时,也就是说,我想用另一个图像替换 Icon.jpg。MyFolder 是包含图像“Icon.jpg”的文件夹路径(名称始终相同)。所以每当我尝试用任何其他图像替换 Icon.jpg 时,我都会收到一个错误Image file in Use

任何人都可以建议如何克服这个问题。如果我需要澄清我的问题,请告诉我。

感谢期待。

4

1 回答 1

1
  • INotifyPropertyChanged在课堂上实施。

  • 将您的属性更改为“获取”“设置”

  • 并且不要忘记设置 DataContext。

这是代码:

public class MyClass : INotifyPropertyChanged
{
    private string imagePath;
    public string ImagePath
    {
        get { return imagePath; }
        set
        {
            if (imagePath != value)
            {
                imagePath = value;
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.UriSource = new Uri(ImagePath);
                bitmapImage.EndInit();
                imgSource = bitmapImage;
            }
        }
    }

    public BitmapImage logo;
    public ImageSource imgSource
    {
        get { return logo; }
        set
        {
            if (logo != value)
            {
                logo = value;
                OnPropertyChanged("imgSource");
            }
        }
    }

    #region INotifyPropertyChanged implementation
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

更新

BitmapImage已知在使用字符串传递路径时保持文件加载。改为加载FileStreamBitmapImage作为默认设置的按需加载能力。要使位图加载图像,EndInit您必须更改ChacheOption

using (FileStream stream = File.OpenRead(@"C:\MyFolder\Icon.jpg"))
{
    logo = new BitmapImage();
    logo.BeginInit();
    logo.StreamSource = stream;
    logo.CacheOption = BitmapCacheOption.OnLoad;
    logo.EndInit();
}
于 2013-01-29T09:03:01.710 回答