«System.OutOfMemoryException» при использовании шрифта из локального системного кэша - PullRequest
0 голосов
/ 06 августа 2010

У меня есть приложение типа слайд-шоу silverlight, имеющее количество слайдов для отображения текста. Каждый слайд может иметь номер TextBlock. У нас есть требование Создания каждого TextBlock во время выполнения, добавляемого на разных панелях. Для каждого TextBlock мы присваиваем значение TextBlock. скачав приложение в системный локальный кеш, мы читаем его содержимое и присваиваем его TextBlock. После некоторых слайдов это дает исключение

System.OutOfMemoryException ' в System.Windows.Documents.FontSource.SetTextFontSourceFromStream (DependencyObject obj) в System.Windows.Controls.TextBox.UpdateFontSource (FontSource fontSource) в System.Windows.Controls.TextBox.set_FontSource (значение FontSource) at TestSlideControl.ShowData ()

Заранее спасибо, DNM

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

Не удивительно, что вы получаете OutOfMemoryException. AFAIK Размер изолированного хранилища по умолчанию составляет максимум 1 МБ. Вы можете предложить пользователю увеличить это значение (IncreaseQuotaTo()) или использовать шрифт меньшего размера (предпочтительно).

Редактировать : По поводу комментария.

Я заметил в оригинальном сообщении, что вы делаете TextBlock.Fontsource = new Fontsource(stream) для каждого TextBlock!
Это означает, что это ~ 22 МБ для каждого TextBlock, который вы создаете. Таким образом, для 100 текстовых блоков вы получаете 2,2 ГБ используемой памяти.
Вы должны кэшировать переменную И каким-то образом использовать шрифт меньшего размера. Вы можете сделать это статическим свойством, которое создается только при первом использовании (или, если вы используете его каждый раз, просто статическое свойство, инициализируемое конструктором):

public static class FontCache
{
    public static FontSource MyCoolFontSource { get; set; }

    static FontCache()
    {
        using (Stream fontStream = ...)
        {
            FontCache.MyCoolFontSource = new FontSource(fontStream);
        }
    }
}

и в коде:

TextBlock.Fontsource = FontCache.MyCoolFontSource;

Также обратите внимание, что вы действительно должны передавать шрифт из изолированного хранилища или из Application.GetResourceStream.

0 голосов
/ 07 августа 2010

Если каждый TextBlock, который вы генерируете, использует один и тот же шрифт, вы должны назначить каждому из них Style. Стиль может установить шрифт, который вы хотите использовать, а также любые другие общие свойства, которыми вы хотите поделиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...