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します。

  • プロパティを「get」「set」に変更します

  • 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文字列を使用してパスを渡すと、ファイルがロードされたままになることが知られています。代わりに a をロードしFileStreamます。BitmapImageデフォルトで設定されているオンデマンド読み込み機能として。ビットマップに画像をロードするよう強制するには、以下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 に答える