1

windows-phone のローカリゼーション リソースについて質問があります。

Resources ファイルに次のような文字列があるとします。

これは何かのテキストです。この値は太字です。これは斜体です。

そして、そのすべてが 1 つの文字列フィールドに格納されます。リソース自体で太字や斜体などのテキスト スタイルを定義するにはどうすればよいですか? 次のように、いくつかのカスタム フォントを事前に定義できます。

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

追加は{StaticResource CustomBold}ページのようですが、文字列フィールドのテキスト全体が太字の場合は解決策になる可能性があります。フレーズの途中にある 1 つの単語を太字にしたい場合はどうすればよいでしょうか。


別の実装を作成するのではなく、ネイティブの c# スタイルのリソース (つまり、文字列名 -> 文字列値) を使用したい。

4

2 に答える 2

3

iOSでこのようなものが必要になったとき、"[b]"、"[/b]"、"[[" および "]]" (私のプロジェクトでは、イタリック体も必要ありませんでした。太字のみです)。

ただし、.NET には、構文の解析に使用した NSScanner クラスの類似物がありません。代わりに、XML データの解析のサポートが大幅に向上しています。そのため、WP7 では、サポートされる <b> タグと <i> タグのみを使用して、XML の非常に基本的なサブセットを簡単に実装できます。サンプル コードについては、このページの最後を参照してください。

書式設定されたテキスト片を WP7 TextBlock に追加する方法は次のとおりです。

更新: OK、ここにあなたのための完全な解決策があります:

[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;
        }
    }
}
于 2012-11-26T14:12:23.720 に答える
0

良い...

私は解決策を見つけましたが、それはかなり不器用に見えます。

使用する必要があるコントロールはRichTextBoxです。

Windows Phone では、RichTextBox はネイティブ .Net とは少し異なります。

テキストの一部に異なるスタイルを設定するには、単一の文字列を分割する必要があります。

では、Resources に文字列フィールドがあるとします。

これは何かのテキストです。この値は太字です。これはそうではありません。

それを 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);

それは本当にうまくいきます。しかし、実装の品質は...まあ、わかりました。誰かがより良い解決策の例を追加できれば、本当に感謝しています。

于 2012-11-28T07:55:58.077 に答える