2012-11-26 26 views
1

我在windows-phone有一個關於本地化資源的問題。本地化資源中的文本樣式

比方說,我有一個字符串在我的資源文件,它應該像爲:

這是一些文本。 此值爲爲粗體。 這一個是斜體。

而且全部存儲在單個字符串字段中。我怎樣才能在資源中定義像粗體或斜體這樣的文本樣式?我知道,我可以預先設置一些自定義字體,像這樣:

<FontFamily x:Key="CustomBold">...</FontFamily> 

,然後添加是在頁面{StaticResource CustomBold},但可以是一個解決方案,如果在串場整個文本是大膽的。如果我想在該短語的中間加粗一個單詞,該怎麼辦?我想使用原生的c#風格的資源(即字符串名稱 - >字符串值),而不是編寫不同的實現。

回答

3

當我需要這樣的iOS版本時,我已經實現了非常基本的BBCode-alike標記語言,只有一些標籤:「[b]」,「[/ b]」,[[「and」]]「 (在我的項目中,我甚至不需要斜體,只有粗體)。

但是,.NET沒有用於解析語法的NSScanner類的模擬。相反,它對解析XML數據有更好的支持。因此,在WP7上,實現XML的一個非常基本的子集更容易,僅支持<b>和<i>標籤。有關示例代碼,請參見this page的末尾。

Here's how to add formatted text pieces into the WP7 TextBlock.

更新:好,這裏是你的完整的解決方案:

[Flags] 
enum eParseState: byte 
{ 
    bold = 1, 
    italic = 2, 
} 

// Sample input: "<txt>This is <i>some</i> text. <b>This value is <i>bold</i>.</b> This one is not.</txt>" 
static void parseRichText(TextBlock tb, string xml) 
{ 
    tb.Inlines.Clear(); 
    XmlReader reader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings() { ConformanceLevel=ConformanceLevel.Fragment }); 
    eParseState state = 0; 

    var names = new Dictionary<string, eParseState>() 
    { 
     { "b", eParseState.bold }, 
     { "i", eParseState.italic }, 
    }; 

    Action<bool> actElement = (bool isOpening) => 
    { 
     string name = reader.Name.ToLower(); 
     eParseState flag; 
     if(!names.TryGetValue(name, out flag)) return; 
     if(isOpening) 
      state |= flag; 
     else 
      state &= (~flag); 
    }; 

    while(reader.Read()) 
    { 
     switch(reader.NodeType) 
     { 
      case XmlNodeType.Element: 
       actElement(true); 
       break; 
      case XmlNodeType.EndElement: 
       actElement(false); 
       break; 
      case XmlNodeType.Text: 
       var run = new Run() { Text = reader.Value }; 
       if(0 != (state & eParseState.bold)) run.FontWeight = FontWeights.Bold; 
       if(0 != (state & eParseState.italic)) run.FontStyle = FontStyles.Italic; 
       tb.Inlines.Add(run); 
       break; 
     } 
    } 
} 
+0

看不到,這如何適合Windows Phone中的_Resources_。你給的最後一個鏈接只是簡單地展示瞭如何直接將字符串片段添加到代碼中,而不是從資源中添加。關於XML,我想,我可以爲資源添加幾個xml文件(每種語言1個,lol),然後編寫一個解析器,這將從那裏獲取值......但對我來說聽起來有點矯枉過正。應該有更好的解決方案。 – Olter

+0

在您的本地化字符串表中,您將文本與您的標記相關聯,例如「這是一些文字,[b]這個值[/ b]是大膽的[i]這個[/ i]是斜體。」如果您要實現BB代碼或「這是一些文本此值是粗體這一個是斜體。」你必須自己實現標記解析。不,沒有更好的解決方案。 – Soonts

+0

我真的很喜歡你的想法,但我找不到實現它的方法。如果你可以添加代碼,如何做到這一點,我會非常感激。無論如何,感謝您的幫助。 – Olter

0

嗯......

我已經找到了解決方案,但它看起來相當笨拙。

應該使用的控件是RichTextBox

在Windows Phone的RichTextBox的作品有點不同,不是在本地.NET

要爲部分文字設置不同的風格,我們不得不將我們的單串:

所以,讓我們想象,我們在資源中有一個字符串字段:

這是一些文本。 該值爲粗體。這一個不是。

分成3串(是的,這是真正的笨拙):

  1. 這是一些文本。
  2. 此值爲黑體
  3. 這一個不是。

然後,在代碼中,我們正在使用RichTextBox rtb

  Paragraph paragraph = new Paragraph(); 
      Bold bold = new Bold(); 
      bold.Inlines.Add(new Run() { Text = _string2FromResources }); 

      Run run = new Run(); 
      run.Text = _string1FromResources; 
      Run run2 = new Run(); 
      run2.Text = _string3FromResources; 

      paragraph.Inlines.Add(run); 
      paragraph.Inlines.Add(bold); 
      paragraph.Inlines.Add(run2); 

      rtb.Blocks.Add(paragraph); 

這將真的有效。但是執行的質量......呃,你明白了。所以我非常感謝,如果有人可以添加更好的解決方案的例子。