Podmiana obrazka źródłowego wpf

Podmiana obrazka źródłowego wpf
BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
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:

Kopiuj
                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ść.

kzkzg
  • Rejestracja:ponad 8 lat
  • Ostatnio:16 minut
  • Postów:926
1

U mnie działa

Kopiuj
 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;
        }
    }

Keep calm and blame frontend.
Tell your cat I said pspsps.
BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
0

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

Kopiuj
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

edytowany 3x, ostatnio: Botek
BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
1

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

Kopiuj
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;
edytowany 2x, ostatnio: Botek
Akihito
fajnie, ze podzieliles sie rozwiazaniem za to lapka ode mnie

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.