繁体   English   中英

从本地系统缓存使用Font时出现“ System.OutOfMemoryException”

[英]'System.OutOfMemoryException' when using Font from local system cache

我有一个Silverlight幻灯片类型的应用程序,其中有许多幻灯片可以显示文本。 每个幻灯片都可以具有多个TextBlock。 我们需要在运行时创建每个TextBlock,并在不同的面板中添加。为每个TextBlock分配TextBlock.Fontsource = new Fontsource(stream)的值。此``stream''数据为ARIALUNI.TTF(22 MB)字体,即由应用程序下载到系统本地缓存中,我们读取其内容并将其分配给TextBlock。 经过一些幻灯片后,它给出了例外

System.Windows.Documents.FontSource.SetTextFontSourceFromStream(DependencyObject obj)在System.Windows.Controls.TextBox.UpdateFontSource(FontSource fontSource)在System.Windows.Controls.TextBox.set_FontSource(FontSource值)处的'System.OutOfMemoryException' 。 ShowData()

在此先感谢DNM

难怪你会得到一个OutOfMemoryException AFAIK隔离存储的大小默认最大为1MB。 您可以提示用户增加该值( IncreaseQuotaTo() ),也可以使用较小的字体(首选)。

编辑 :关于评论。

我在原始帖子中注意到,您正在为每个TextBlockTextBlock.Fontsource = new Fontsource(stream)
这意味着您创建的每个TextBlock约为22MB。 因此,对于100个TextBlocks,您将消耗2.2GB的内存。
您应该缓存该变量,并以某种方式使用较小的字体。 您可以将其设置为仅在首次使用时创建的静态属性(或者,如果您每次都使用,则只需构造函数初始化的静态属性即可):

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中流式传输字体。

如果您生成的每个TextBlock使用相同的字体,则应为每个它们分配一个Style 样式可以建立您要使用的字体以及您要共享的任何其他常用属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM