SORU
10 ŞUBAT 2012, Cuma


Metin yerine XamlPackage içinde

Bir Denetler metin var. Bu metin etiketleri, örneğin içerir: [@TagName!]. Biçimlendirme kaybetmeden bir veritabanı (yazı tipi, renk, resim, vb) gelen bazı veriler ile bu etiketleri değiştirmek istiyorum. Bir yöntem oluşturdum:

 void ReplaceTagsWithData(FlowDocument doc)
    {
        FileStream fs = new FileStream("tmp.xml", FileMode.Create);
        TextRange trTextRange = 
            new TextRange(doc.ContentStart, doc.ContentEnd);

        trTextRange.Save(fs, DataFormats.Xaml);
        fs.Dispose();
        fs.Close();

        StreamReader sr = new StreamReader("tmp.xml");

        string rtbContent = sr.ReadToEnd();

        MatchCollection mColl = 
            Regex.Matches(rtbContent, 
                          string.Format(@"\{0} [a-zA-Z] {1}", 
                          prefix, 
                          postfix));

        foreach (Match m in mColl)
        {
            string colname = 
                m.Value.Substring(prefix.Length, 
                   (int)(m.Value.Length - (prefix.Length   postfix.Length)));

            rtbContent = rtbContent.Replace(m.Value.ToString(), 
                                            dt.Rows[0][colname].ToString());
        }

        rtbEdit.Document = 
            new FlowDocument(
                (Section)XamlReader.Load(
                    XmlReader.Create(new StringReader(rtbContent))));
        sr.Dispose();
        sr.Close();
    }

Çok iyi değil ama içerik görüntüleri kaldırır. Xaml yerine XamlPackage kullanmam gerektiğini biliyorum ama o zaman düz metin olarak alamıyorum. Bunun için başka bir çözüm var mı?

Cevaplar için teşekkürler. ;)

[DÜZENLEME: 13-02-2012 02:14(am)]

Benim çalışma çözüm:

    void ReplaceTagsWithData(RichTextBox rtb)
{
    FlowDocument doc = rtb.Document;

    FileStream fs = new FileStream("tmp", FileMode.Create);
    TextRange trTextRange = new TextRange(doc.ContentStart, doc.ContentEnd);
    trTextRange.Save(fs, DataFormats.Rtf);
    fs.Dispose();
    fs.Close();

    StreamReader sr = new StreamReader("tmp");
    string rtbContent = sr.ReadToEnd();
    sr.Dispose();
    sr.Close();

    MatchCollection mColl = 
        Regex.Matches(rtbContent, 
                      string.Format(@"\{0} [a-zA-Z] {1}", 
                      prefix, 
                      postfix));

    foreach (Match m in mColl)
    {
        string colname = 
            m.Value.Substring(prefix.Length, 
                (int)(m.Value.Length - (prefix.Length   postfix.Length)));

        rtbContent = rtbContent.Replace(m.Value.ToString(), 
                                        dt.Rows[0][colname].ToString());
    }
    MemoryStream stream = 
        new MemoryStream(ASCIIEncoding.Default.GetBytes(rtbContent));
    rtb.SelectAll();
    rtb.Selection.Load(stream, DataFormats.Rtf);

}

Belki en iyisi değil ama düzgün çalışıyor.

Çözülmüş oldu. Ama artık giremiyorum hangi şirket sunucu üzerinde olduğundan çözüm yorum yazamıyorum.

CEVAP
25 Temmuz 2013, PERŞEMBE


Razor Motoru ne istersen şablon konu yapmak için kullanabilirsiniz. Nuget indirebilirsiniz (http://www.nuget.org/packages/RazorEngine) ve herhangi bir kurulum yapılandırma olmadan Razor sözdizimi bunu yapmak için kullanabilirsiniz. Örneğin şablon bu olabilir:

<Window x:Class="<class>"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="@Model.Title"
        Icon="@Model.Icon">
  <Grid>    
  </Grid>
</Window>

Not: @Model.Başlık ve @Model.Simge thats Jilet geliyor

Aslında tüm şablon benim göreve RazorEngine kullanıyorum: E-posta, sinek (rdlc), vb Rapor oluşturma...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • Lena Danya

    Lena Danya

    11 NİSAN 2010
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012