2010-03-03 18 views
9

Bir kullanıcının bir numaralı telefondan mevcut düzeltme konumunda başka bir metin yerleştirmesine izin vermesi gereken bir uygulama yapıyorum. Bu teknikle genelinde çalıştırmadan önce FlowDocument 'ın nesne modeli düşüp kalkıyor zaman sürü geçirdi - source ve target hem FlowDocument ler şunlardır:Satır içi içeriği bir FlowDocument öğesinden diğerine nasıl eklenir?

using (MemoryStream ms = new MemoryStream()) 
{ 
    TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);      
    tr.Save(ms, DataFormats.Xaml); 
    ms.Seek(0, SeekOrigin.Begin); 
    tr = new TextRange(target.CaretPosition, target.CaretPosition); 
    tr.Load(ms, DataFormats.Xaml); 
} 

Bu iyi derece çalışır.

Şu anda sahip olduğum tek sorun, kaynağın her zaman yeni bir paragraf olarak eklenmesidir. Geçerli koşuyu (veya her neyse) çarpanda koparır, kaynağı ekler ve paragrafı sonlandırır. Bu kaynak aslında bir paragraf (veya birden fazla paragraf), ancak bir metin satırı (varsa) değilse, bu uygun olur.

Sanırım bunun cevabının tamamen tek bir bloktan oluşup oluşmadığını görmek için hedefi kontrol etmek olduğu ve eğer varsa, TextRange'un başlangıç ​​ve bitiş noktasını belirlemesidir. bloğun içeriğini akışa kaydetmeden önce.

FlowDocument'un tüm dünyası, karanlık gizemlerin benim için bir deniz olduğunu. Gerekirse bir uzman olabilirim (Dostoyevski'ye göre: "İnsan herhangi bir şeye alışabilen hayvandır."), Ama birisi bunu zaten anladıysa ve bunu nasıl yapacağımı söylerse bu benim hayat çok daha kolay.

cevap

12

Anında sorun, TextFormat.XamlPackage yerine TextFormat.Xaml kullanıyor olmanızdır.

Satırlar birleştirildiğinde satırların birleştirilip birleştirilmediğini denetleyen özellik, Section.HasTrailingParagraphBreakOnPaste özelliğidir. Bu özellik, XamlPackage metin biçimini yüklerken veya kaydederken yalnızca etkili geçer. Bunun yerine Xaml metin biçimini kullanırken, Save() sırasında atlanır ve Load() sırasında yoksayılır.

Yani basit bir düzeltme basitçe yükleyin değiştirmektir ve kaydet çağırır: Bu da sonunda içine aday olacağını başka bir sorun giderdiği

tr.Save(ms, DataFormats.XamlPackage); 
ms.Seek(0, SeekOrigin.Begin); 
tr = new TextRange(target.CaretPosition, target.CaretPosition); 
tr.Load(ms, DataFormats.XamlPackage); 

Not: Gömülü nbspbitmap'lerdir düzgün kopyalanmayacak DataFormats.Xaml kullanırken çünkü orada görüntü bitlerini koymak için bir yer yok. DataFormats.XamlPackage ile bir paketin tamamı oluşturulduğundan, bitmapler ve diğer paket öğeleri tamamıyla karşınıza gelecektir.

Bu değişikliği yaptıktan sonra sizin için bir sorun olabilecek veya olmayabilecek başka bir gerçeği keşfedebilirsiniz: Örnek kodunuz document.ContentStart ve document.ContentEnd kullanır. Bu sizin gerçek kodunuzsa, document.ContentStart ile document.ContentEnd arasındaki herhangi bir aralığın zorunlu olarak tam paragraflardan oluştuğunu keşfedeceksiniz, bu nedenle kopyalamanın yapılması, ekleme işleminin sonunda her zaman bir paragraf kesmesi olacaktır. bu bir sorun ise, (bu UI tahrikli ise) RichTextBox.Selection gibi bir şey kullanabilir veya örneğin örtülü paragraf işareti önce için ContentEnd yedeklemek için TextPointer kullanın: Bir süre olacak

var tr = new TextRange(document.ContentStart, 
         document.ContentEnd.GetInsertionPosition(
                LogicalDirection.Backward)); 
+0

Aslında can önce Git ve doğru olup olmadığını kontrol et, ama sanırım şu an tam da tam burada olduğum gibi görünüyor ve bilgileri takdir ediyorum. –