Bir wpf TextBlock denetimine yeni bir satır nasıl eklenir?


103

Bir XML dosyasından metin alıyorum ve textblock render tarafından yeni satırlar olarak yorumlanan bazı yeni satırlar eklemek istiyorum.

Denedim:

<data>Foo bar baz \n baz bar</data>

Ancak veriler yeni satır olmadan hala görüntülenir. Ben içeriğini ayarlamak <data>yoluyla .TextC # aracılığıyla mülke.

Yeni satırı GUI'de işlemek için XML'e ne koymam gerekiyor?

XAML'de metni manuel olarak ayarlayarak böyle bir şey denedim:

<TextBlock Margin="0 15 0 0" Width="600">
There &#10;
is a new line.
</TextBlock>

Ve kodlanmış karakter GUI'de görünmese de, bana yeni bir satır da vermiyor.


dönüş karakterini "tırnak işaretleri"
arasına almayı

@DJKRAZE: Alıntılar hiçbir şey yapmaz, ne r ve n birlikte. : S
Sadece Bolivya Burada

@BalamBalam: Bu aynı değil, bu soru Text özniteliğiyle ilgili açıklık.
HB

Şimdi "" neden işe yaramayacağını tamamen anladığımı görüyorum .. O halde <LineBreak> 'in daha çok gerçek / anahtar bir kelime olacağını varsayıyorum. benim hatam .. Harika cevap HB
MethodMan

Dan Vogel, güncel bir çalışma çözümü oluşturdu. WPF, \ r \ n'yi \\ r \\ n olarak yorumlar.
zORg Alex

Yanıtlar:


176

Verilere yeni bir satır eklemeyi deneyebilirsiniz:

<data>Foo bar baz 
 baz bar</data>

Bu işe yaramazsa, dizeyi manuel olarak ayrıştırmanız gerekebilir.

Doğrudan XAML'ye ihtiyacınız varsa, bu kolay:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>

Hayır, bu da hiçbir şey yapmaz. İçeriği TextBlock'un XAML'sinin içine yeni satırlar olarak enter baskılarıyla yapıştırdım ve yine de aynı anda görüntülüyor.
Sadece Bolivyalı Burada

3
@SergioTapia: Bazı veri dosyasında kesme olması ile XAML arasında bir fark vardır, XAML ayrıştırıcısı beyaz boşluğu yok sayar, ancak örneğin, XmlSerializerkesmeleri kullanarak bazı XML'in serisini kaldırırsanız, korunacaktır. Xaml'da ihtiyacınız var <LineBreak/>.
HB

Yeni satırı doğrudan verinin içine koyun ... elbette! Burada boşuna \ n, <LineBreak /> ve tonlarca html kodu denemek için çok zaman harcadım. Önce en basit yaklaşımı denemeliydim.
thehelix

66

Tamlık için: Bunu da yapabilirsiniz:

 <TextBlock Text="Line1&#x0a;Line 2"/>

x0A, çıkış karakterli onaltılık Satır Beslemedir. Eşdeğeri \ n


2
Şunun gibi bir senaryoda bağlamada kullanışlıdır: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Ad: {0} & # x0a; Kod: {1}"> <Bağlama Yolu = "Ad" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
bu en iyi cevap
Aurélio Antonio

Bu bağlantıyı eklerim: stackoverflow.com/questions/9021649/… cevaba bir açıklama.
I. Adım

22

Bağlamayı da kullanabilirsiniz

<TextBlock Text="{Binding MyText}"/>

Ve MyText'i şu şekilde ayarlayın:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}

9
String.Format () 'a bile ihtiyacınız yok. "Metnim \ n Metniniz" i döndür; gayet iyi çalışıyor.
Zodman

18

kullanmalısın

 < SomeObject xml:space="preserve" > once upon a time ...
      this line will be below the first one < /SomeObject>

Veya tercih ederseniz:

 <SomeObject xml:space="preserve" />  once upon a time... &#10; this line below < / SomeObject>

dikkat: eğer ikiniz de & 10 kullanırsanız VE metninizde sonraki satıra giderseniz, İKİ boş satırınız olur.

ayrıntılar için burayı tıklayın: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

Bu eski bir soru olmasına rağmen, soruna henüz rastladım ve verilen cevaplardan farklı bir şekilde çözdüm. Belki başkalarına yardımcı olabilir.

XML dosyalarımın şöyle görünmesine rağmen şunu fark ettim:

<tag>
 <subTag>content with newline.\r\nto display</subTag>
</tag>

C # koduma okunduğunda dizede çift ters eğik çizgi vardı.

\\r\\n

Bunu düzeltmek için fazladan ters eğik çizgiyi kaldırmak için bir ValueConverter yazdım.

public class XmlStringConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string valueAsString = value as string;
        if (string.IsNullOrEmpty(valueAsString))
        {
            return value;
        }

        valueAsString = valueAsString.Replace("\\r\\n", "\r\n");
        return valueAsString;
    }

    public object ConvertBack(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

TextBlock'taki XAML'ye eklemek zorunda kalmanın yanı sıra TextWrapping="Wrap"(ve AcceptsReturn="True"eğer bu bir TextBox ise), doğru yapmıştınız ve cevap bu olmalı - ancak sadece .Replace()veritabanından gelen değer üzerinde yapmayı söyleyin - buna gerek yok fantezi işlevi: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); Dönüş tuşu kullanılarak girilen herhangi bir değer, DB'ye çok iyi yazılır - sizin de belirttiğiniz gibi, C #, sorunların neden olduğu değeri görüntülemek için onu tuttuğunda. Bu nedenle, buna metnin yüklemesi çağrılması gerekir.
vapcguy

10

Her şey başarısız olursa, şunu da kullanabilirsiniz:

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"

8
<TextBlock Margin="4" TextWrapping="Wrap" FontFamily="Verdana" FontSize="12">
        <Run TextDecorations="StrikeThrough"> Run cannot contain inline</Run>
        <Span FontSize="16"> Span can contain Run or Span or whatever 
            <LineBreak />
        <Bold FontSize="22" FontFamily="Times New Roman" >Bold can contains 
            <Italic>Italic</Italic></Bold></Span>
</TextBlock>

1

System.Environment.NewLine'ı kullanmak benim için çalışan tek çözümdür. \ R \ n denediğimde, metin kutusunda gerçek \ r \ n tekrarlandı.


0

Metin bloğunun bu seçeneğin etkinleştirildiğinden emin olmalısınız:

AcceptsReturn="True"

AcceptsReturn sadece TextBox içindir, TextBlock için değil
Steve

0

RichTextBox "rtb" ye aşağıdaki gibi bir "satır sonu" veya "paragraf sonu" ekleyin:

var range = new TextRange(rtb.SelectionStart, rtb.Selection.End); 
range.Start.Paragraph.ContentStart.InsertLineBreak();
range.Start.Paragraph.ContentStart.InsertParagraphBreak();

NewLine öğelerini almanın tek yolu, önce "\ r \ n" öğeleriyle metin eklemek ve ardından Selection ve / veya TextRange nesneleri üzerinde çalışan daha fazla kod uygulamaktır. Bu, \ par öğelerinin \ satır öğelerine dönüştürüldüğünden, istendiği gibi kaydedildiğinden ve * .Rtf dosyası yeniden açılırken hala doğru olduğundan emin olur. Şimdiye kadar zorlu denemelerden sonra bulduğum şey buydu. Satırların ve Kesmelerin gitmesi gereken TextPointer öğelerini (.Start .End .ContentStart .ContentEnd) ayarlamak için üç kod satırımın daha fazla kodla (döngülerle) çevrelenmesi gerekiyor, bunu amaçlarım için başarılı bir şekilde yaptım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.