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
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...
Nasıl metin dikey olarak ortala CSS il...
Otomatik Ölçek Metin Sınırları içinde ...
Android bir düzen içinde altı çizili m...
Yüce Metin içinde sekme ile dört boşlu...
Neden metin dosyaları Apache tarafında...