Динамическая загрузка изображений в WPF

Наиболее распространенной причиной переполнения стека является чрезмерно глубокая или бесконечная рекурсия. Если это ваша проблема, этот учебник о Java Recursion может помочь понять проблему.

49
задан sindre j 20 February 2009 в 13:26
поделиться

3 ответа

Это - потому что Создание было задержано. Если Вы хотите, чтобы изображение было сразу загружено, можно просто добавить этот код в init фазу.

src. CacheOption = BitmapCacheOption. OnLoad;

как это:

src.BeginInit();
src.UriSource = new Uri("picture.jpg", UriKind.Relative);
src.CacheOption = BitmapCacheOption.OnLoad;
src.EndInit();
100
ответ дан redjackwong 7 November 2019 в 21:30
поделиться

Это - странное поведение и хотя я не могу сказать, почему это происходит, я могу рекомендовать некоторые опции.

Первый, наблюдение. Если Вы включаете изображение как Содержание в VS и копируете его в выходной каталог, Ваши работы кода. Если изображение не отмечено как Ни один в VS, и Вы копируете его, это не работает.

Решение 1: FileStream

объект BitmapImage принимает UriSource или StreamSource в качестве параметра. Давайте использовать StreamSource вместо этого.

        FileStream stream = new FileStream("picture.png", FileMode.Open, FileAccess.Read);
        Image i = new Image();
        BitmapImage src = new BitmapImage();
        src.BeginInit();
        src.StreamSource = stream;
        src.EndInit();
        i.Source = src;
        i.Stretch = Stretch.Uniform;
        panel.Children.Add(i);

проблема: поток остается открытым. При закрытии его в конце этого метода изображение не обнаружится. Это означает, что файл остается заблокированным записью в системе.

Решение 2: MemoryStream

Это - в основном решение 1, но Вы читаете файл в поток памяти и передаете тот поток памяти как аргумент.

        MemoryStream ms = new MemoryStream();
        FileStream stream = new FileStream("picture.png", FileMode.Open, FileAccess.Read);
        ms.SetLength(stream.Length);
        stream.Read(ms.GetBuffer(), 0, (int)stream.Length);

        ms.Flush();
        stream.Close();

        Image i = new Image();
        BitmapImage src = new BitmapImage();
        src.BeginInit();
        src.StreamSource = ms;
        src.EndInit();
        i.Source = src;
        i.Stretch = Stretch.Uniform;
        panel.Children.Add(i);

Теперь Вы можете изменить файл в системе, если это - что-то, чего Вы требуете.

7
ответ дан Szymon Rozga 7 November 2019 в 21:30
поделиться

Вы могли попытаться присоединить обработчики к различным событиям BitmapImage:

Они могли бы сказать Вам немного о том, что продолжается, что касается изображения.

0
ответ дан Drew Noakes 7 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: