Podmiana obrazka źródłowego wpf

0

Witam od dłuższego czasu męczę się nad podmianą obrazka źródłowego w wpf , w sensie podmiany pliku a nie jego ścieżki. Po podmianie pliku obrazek się nie zmienia. Ładowanie obrazka wygląda tak:

                BitmapImage logo = new BitmapImage();
                logo.BeginInit();
                logo.CacheOption = BitmapCacheOption.OnLoad;
                logo.UriSource = new Uri(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\temporary.png");
                logo.EndInit();
                ObrazekZakodowany.Source = logo;

Po czym podmieniam plik i ładuje go na nowo dokładnie w ten sam sposób, niestety obrazek zmienia się dopiero po restarcie aplikacji. Generalnie domyślam się z czego to wynikam ,ale nie umiem wpaść na to jak to obejść.

1

U mnie działa

 public partial class MainWindow : Window
    {
        BitmapImage logo = new BitmapImage();
        public MainWindow()
        {
            logo.BeginInit();
            logo.UriSource = new Uri("c:\\amd\\Untitled1.png");
            logo.EndInit();
            
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            logo = new BitmapImage();
            logo.BeginInit();
            logo.UriSource = new Uri("c:\\amd\\Untitled.png");
            logo.EndInit();
            obraz.Source = logo;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            obraz.Source = logo;
        }
    }
0

Dziękuje bardzo za odpowiedź. Przepraszam ale zapomniałem napisać ,że podmieniam plik w tym samym programie.

public static void SaveClipboardImageToFile(string filePath,BitmapSource image)
        {
          
            using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                BitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(image));
                encoder.Save(fileStream);
            }
        }

I tutaj twój kod się gryzie bo aplikacja wykorzystuje ten plik.

The process cannot access the file because it is being used by another process

1

Udało mi się znaleźć rozwiązanie jest to flaga ignorowania pamięci cashe

BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
logo.CacheOption = BitmapCacheOption.OnLoad;
logo.UriSource = new Uri(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\temporary.png");
logo.EndInit();
ObrazekZakodowany.Source = logo;

1 użytkowników online, w tym zalogowanych: 0, gości: 1