我有一个silverlight幻灯片类型应用程序,有多个幻灯片可以显示文本。每张幻灯片可能有许多TextBlock。我们要求在运行时创建每个TextBlock添加到不同的面板中。对于每个TextBlock,我们分配TextBlock.Fontsource = new Fontsource(stream)的值。这个'stream'数据是ARIALUNI.TTF(22 MB)字体,这是通过应用程序在系统本地缓存中下载,我们读取其内容并将其分配给TextBlock。 在一些幻灯片之后,它会出现此异常
'的System.OutOfMemoryException' 在System.Windows.Documents.FontSource.SetTextFontSourceFromStream(DependencyObject obj) 在System.Windows.Controls.TextBox.UpdateFontSource(FontSource fontSource) 在System.Windows.Controls.TextBox.set_FontSource(FontSource值) 在TestSlideControl.ShowData()
先谢谢, DNM
答案 0 :(得分:3)
难怪你得到OutOfMemoryException
。 AFAIK隔离存储大小默认最大为1MB。您可以提示用户增加该值(IncreaseQuotaTo()
)或使用较小的字体(可选)。
修改:关于评论。
我在原帖中注意到您为TextBlock.Fontsource = new Fontsource(stream)
执行了TextBlock
!
这意味着您创建的每个TextBlock大约为22MB。因此,对于100个TextBlock,您会消耗 2.2GB 的内存
你应该缓存变量AND以某种方式使用较小的字体。你可以使它成为一个静态属性,只在第一次使用时创建(或者如果你每次都使用它,只是一个由构造函数初始化的静态属性):
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
流式传输字体。
答案 1 :(得分:0)
如果您生成的每个TextBlock
使用相同的字体,则应为每个Style
分配一个字段。该样式可以建立您要使用的字体以及您要共享的任何其他常用属性。