2010-08-06 37 views
0

我有一个silverlight幻灯片类型的应用程序,有幻灯片显示文本的数量。每张幻灯片可能有多个TextBlock。我们要求在运行时创建每个TextBlock在不同的面板中添加。对于每个TextBlock,我们分配TextBlock.Fontsource的值= new Fontsource(stream)。这个'stream'数据是ARIALUNI.TTF(22 MB)字体,它是由系统本地缓存中的应用程序下载,我们读取其内容并将其分配给TextBlock。 一些幻灯片后,给出了这样的例外从本地系统缓存中使用字体时'System.OutOfMemoryException'

'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

+1

22mb大小的字体????神圣莫里!有没有可以测试的较小的一个? – leppie 2010-08-06 07:18:38

回答

3

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

编辑:关于评论。

我注意到在原文中你对TextBlock每个做的都是TextBlock.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字体。

+0

字体在本地缓存(临时文件)中的应用程序的开始下载。我们不保存在孤立的存储 – Dharam 2010-08-06 14:27:24

+1

@Dharam:我刚刚注意到你的原始帖子:你正在做'... = new Fontsource (..)'为每个TextBlock?你知道每个你创建的TextBlock大约是22MB,对吧?因此,对于100个TextBlocks,您将获得2.2GB的内存消耗。你应该缓存变量AND以某种方式使用较小的字体。您可以将其设置为仅在首次使用时创建的静态属性。 – 2010-08-07 08:04:58

0

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