C# 本地化资源中的文本样式
我有一个关于windows phone本地化资源的问题 比方说,我的资源文件中有一个字符串,它应该如下所示: 这是一些文本此值为粗体。这个是斜体的 所有这些都存储在一个字符串字段中。如何在参考资料中定义粗体或斜体等文本样式?我知道,我可以预定义一些自定义字体,如下所示:C# 本地化资源中的文本样式,c#,windows-phone-7,localization,text-styling,C#,Windows Phone 7,Localization,Text Styling,我有一个关于windows phone本地化资源的问题 比方说,我的资源文件中有一个字符串,它应该如下所示: 这是一些文本此值为粗体。这个是斜体的 所有这些都存储在一个字符串字段中。如何在参考资料中定义粗体或斜体等文本样式?我知道,我可以预定义一些自定义字体,如下所示: <FontFamily x:Key="CustomBold">...</FontFamily> 。。。 然后在页面中添加为{StaticResource CustomBold},但如果字符串字段中的整
<FontFamily x:Key="CustomBold">...</FontFamily>
。。。
然后在页面中添加为{StaticResource CustomBold}
,但如果字符串字段中的整个文本为粗体,则这可能是一个解决方案。如果我想在短语中间加上一个单词,那该怎么办?
我想使用本机c风格的资源(即字符串名称->字符串值),而不是编写不同的实现。当我在iOS中需要类似的东西时,我已经实现了非常基本的标记语言,只有几个标记:“[b]”、“[/b]”、“[[”和“]]”(在我的项目中,我甚至不需要斜体,只需要粗体) 但是,.NET没有类似于我用来解析语法的NSScanner类。相反,它对解析XML数据有更好的支持。因此,在WP7上更容易实现非常基本的XML子集,只支持和标记。有关示例代码,请参见的末尾 更新:好的,以下是完整的解决方案:
[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;
}
}
}
[标志]
枚举eParseState:字节
{
粗体=1,
斜体=2,
}
//示例输入:“这是一些文本。此值为粗体。此值为非粗体。”
静态void parseRichText(文本块tb,字符串xml)
{
tb.Inlines.Clear();
XmlReader=XmlReader.Create(新的StringReader(xml),新的XmlReaderSettings(){ConformanceLevel=ConformanceLevel.Fragment});
eParseState=0;
var name=newdictionary()
{
{“b”,eParseState.bold},
{“i”,eParseState.italic},
};
动作动作元素=(布尔等间距)=>
{
string name=reader.name.ToLower();
国旗;
如果(!names.TryGetValue(name,out标志))返回;
if(等间距)
州|=国旗;
其他的
州&=(~旗);
};
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
actElement(真);
打破
案例XmlNodeType.EndElement:
actElement(假);
打破
案例XmlNodeType.Text:
var run=newrun(){Text=reader.Value};
如果(0!=(state&eParseState.bold))run.fontwweight=fontwweights.bold;
如果(0!=(state&eParseState.italic))run.FontStyle=FontStyles.italic;
tb.Inlines.Add(运行);
打破
}
}
}
嗯
我找到了一个解决办法,但它看起来相当笨拙
应该使用的控件是RichTextBox
在Windows Phone中,RichTextBox的工作原理与本机.Net略有不同
要为部分文本设置不同的样式,我们必须分割单个字符串:
让我们想象一下,在参考资料中有一个字符串字段:
这是一些文本此值为粗体。这个不是
将其分为三个字符串(是的,这真的很笨拙):
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);
那真的很管用。但实施的质量。。。好吧,你明白了。因此,如果有人能提供更好的解决方案,我将不胜感激。我看不出,这与Windows Phone中的资源有什么关系。您给出的最后一个链接只是演示如何直接将字符串片段添加到代码中,而不是从资源中添加。关于XML,我想,我可以向资源中添加几个XML文件(每种语言1个,lol),然后编写一个解析器,从中获取值。。。但这听起来对我来说有点过分了。应该有更好的解决方案。在本地化的字符串表中,将文本与标记放在一起,例如,“这是一些文本。[b]此值[/b]为粗体。[i]此值[/i]为斜体。”如果要实现BB代码,或“这是一些文本。此值为粗体。此值为斜体”。您必须自己实现标记解析。不,没有更好的解决办法。我真的很喜欢你的想法,但我找不到一个方法来实现它。如果你能添加代码,如何做,我会非常感激。无论如何,谢谢你的帮助。啊,现在我明白了。出于某种原因,XML文件让我有点迷失方向,我认为应该在参考资料中创建一个单独的XML文件。谢谢,这比我的解决方案要好得多。