Dize özelliğinde yeni satır


283

Nitelik olarak ayarlandığında metne satır sonu nasıl ekleyebilirim:

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

Patlamış biçime dönüştürmek benim özel durumum için bir seçenek değil. İhtiyacım olan aşağıdakileri taklit etmenin bir yolu:

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>

Yanıtlar:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

Bir değişmez değeri temsil etmek için onaltılık olarak kodlanmış herhangi bir değeri kullanabilirsiniz. Bu durumda, satır beslemeyi kullandım (karakter 10). Eğer "klasik" yapmak istiyorsanız vbCrLf, o zaman kullanabilirsiniz&#x0d;&#x0a;

Bu arada, sözdizimini not edin: Bu ve işareti, bir pound, x harfi , daha sonra istediğiniz karakterin onaltılık değeri ve son olarak bir noktalı virgül.

AYRICA: Tamlık için, içinde zaten satır beslemeleri kodunuzdaki bir sabit gibi gömülü olan bir metne veya çalışma zamanında oluşturulmuş bir değişkene bağlanabilirsiniz.


14
Görünüşe göre bu, <TextBlock.Text> </ TextBlock.Text> Etiketler içinde çalışmaz.
tcables

45
Bugün itibariyle, bu cevapta 34 oy var ve hala geri dönüp kontrol etmem gerekiyordu çünkü sözdizimi çok eski.
Bob King

3
Kesinlikle. Bunu imi aldım. Gelip kontrol etmeliyim.
MojoFilter

4
'Archaic' ==> 'Arcane' :-)
Will Dean

5
Gibi ters eğik çizgi eklerken bir bağlayıcı parametrenin içinde bile çalışır: ConverterParameter = 'Test \ & # x0a; Metin'
Sven

72

Kaynak XAML içindeki boşlukları korumak için xml: space = "preserve" özelliğini kullanabilirsiniz.

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8
Ayrıca xml: space = "preserve" komutunu kaldırabilir ve satırların arasına <LineBreak /> ekleyebilirsiniz
yararlıBaşlangıç

5
Genellikle xml:space="preserve"XAML'de bulunan girinti boşluklarını da tutacağı belirtilmelidir (birkaç yıl sonra) . Dolayısıyla, <LineBreak />yukarıda önerildiği gibi açık bir çözüm daha temiz bir çözüm gibi görünmektedir.
Zeus

Teşekkürler! Bu çözüm benim XAML tabanlı serileştirme koduma çok iyi uyuyordu.
Seraphim

Ah bu mükemmel çalıştı. Beni kazan plakası kodundan kurtardı. thanks
iam.Crotrot

57

Bir dizede (örneğin, kaynaklarınızda) yapmanız gerektiğinde xml:space="preserve" ve ve işareti karakter kodlarını kullanmanız gerekir :

<System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String>

Veya metindeki gerçek satırlar:

<System:String x:Key="TwoLiner" xml:space="preserve">First line 
Second line</System:String>

Uyarı: İkinci örnek gibi bir kod yazarsanız , işletim sisteminizin ve / veya metin düzenleyicinizin kullandığı satır sonlarına bağlı olarak ya bir satırsonu ya da satır başı ve satırsonu eklediniz. Örneğin, bunu yazarsanız ve linux sistemlerinden gitmeyi taahhüt ederseniz, her şey iyi görünebilir - ancak birisi Windows'a klonlarsa, git, satır sonlarınızı \r\nve dizenizin ne olduğuna bağlı olarak değiştirir ... dünyayı kırabilir.

Boşluğu korurken bunun farkında olun. Böyle bir şey yazarsanız:

<System:String x:Key="TwoLiner" xml:space="preserve">
First line 
Second line 
</System:String>

Aslında dört satır sonu, muhtemelen dört satır başı ve görünmeyen potansiyel olarak izleyen beyaz boşluk eklediniz ...


10
BTW, xml:space="preserve"özniteliği sadece da uygulayabilirsiniz ResourceDictionary, böylece her kaynak dizesine uygulamanız gerekmez.
ocodo

1
Ve işareti olmadan da çalışır. Bunun gibi bir şey: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (İlk satır ile İkinci satır arasında bir satır sonu ile)
vgaltes

1
Keşke sana +10 verebilirimxml:space="preserve"
TimothyP

1
@trooper Düzenlemeyi yeni yaptım ve Jaykul / mod'un onayına bırakıldı. Ve Jaykul'un daha fazla yapısı burada küçük ayrıntıları gerçekten açıklığa kavuşturdu (çünkü düzenlemem istenen çıktıyı tam olarak istendiği gibi vermediğinden). Genel olarak, bu etkileşimin kendi cevaplarımı göndermekten daha iyi cevaplar oluşturmaya yardımcı olduğunu söyleyebilirim.
Anthony Lusardi

21

<TextBlock.Text>İçeriğinizi aşağıdaki gibi kaldırmanız ve eklemeniz yeterlidir:

    <Grid Margin="20">
        <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17">
        <Bold FontFamily="Segoe UI Light" FontSize="70">I.R. Iran</Bold><LineBreak/>
        <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, 
        is a country in Western Asia. The country is bordered on the 
        north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia 
        to the north across the Caspian Sea.<LineBreak/>
        <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span>
            <LineBreak/>
            <LineBreak/>
            <Span FontSize="12">
                <Span>Is this page helpful?</Span>
                <Button Content="No"/>
                <Button Content="Yes"/>
            </Span>
    </TextBlock>
    </Grid>

resim açıklamasını buraya girin


Ve soru şuydu: " Özellik olarak ayarlandığında metne satır sonunu nasıl ekleyebilirim ", nitelik değil, nitelikti.
dakika

15

Bunu yapmak için bunu Metin özniteliğinde yapmanız gerektiğini unutmayın.

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

12

Belki biri tercih eder

<TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3',
                          Source={x:Static s:Environment.NewLine}}" />

ile xmlns:s="clr-namespace:System;assembly=mscorlib".


Her ne kadar & # x0a; XAML'den çalışıyor gibi görünüyor, koddan değil. Bunu yapar.
FDF

11

Bu sorunun her cevabını deneyen ve hala neden hiçbirinin sizin için çalışmadığına dair kafalarını kayanlar için, karşılaştığım sorunun bir formuyla karşılaşmış olabilirsiniz.

Benim TextBlock.Textözelliği içinde oldu ToolTipService.ToolTipelemanı ve veriler, bir SQL saklı yordam çekilerek bir nesnenin bir özelliği veri sınırlama edildi. Şimdi, saklı yordam içindeki bu özel özellikteki veriler bir SQL işlevinden alınmıştır.

Benim için hiçbir şey işe yaramadığından, aramamdan vazgeçtim ve aşağıdaki dönüştürücü sınıfını oluşturdum:

public class NewLineConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = string.Empty;

        if (value.IsNotNull())
        {
            s = value.ToString();

            if (s.Contains("\\r\\n"))
                s = s.Replace("\\r\\n", Environment.NewLine);

            if (s.Contains("\\n"))
                s = s.Replace("\\n", Environment.NewLine);

            if (s.Contains("&#x0a;&#x0d;"))
                s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);

            if (s.Contains("&#x0a;"))
                s = s.Replace("&#x0a;", Environment.NewLine);

            if (s.Contains("&#x0d;"))
                s = s.Replace("&#x0d;", Environment.NewLine);

            if (s.Contains("&#10;&#13;"))
                s = s.Replace("&#10;&#13;", Environment.NewLine);

            if (s.Contains("&#10;"))
                s = s.Replace("&#10;", Environment.NewLine);

            if (s.Contains("&#13;"))
                s = s.Replace("&#13;", Environment.NewLine);

            if (s.Contains("<br />"))
                s = s.Replace("<br />", Environment.NewLine);

            if (s.Contains("<LineBreak />"))
                s = s.Replace("<LineBreak />", Environment.NewLine);
        }

        return s;
    }

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

@ Dparker'ın cevabındanEnivornment.NewLine yöntemi kullanmak zorunda kaldım . Dönüştürücüye bir satırsonunun olası herhangi bir metin temsilini aramasını ve yerine bunu vermesini söyledim .Environment.NewLine

Bu işe yaradı!

Ancak, diğer yöntemlerin hiçbirinin neden veri bağlı özelliklerle çalışmadığına dair hala şaşırdım.

@ BobKing'in kabul edilen cevabı hakkında bir yorum bıraktım :

@BobKing - Bir SQL sproc katıştırılmış satır beslemeleri olan bir alana bağlanırken ToolTipService.ToolTip içinde çalışmıyor gibi görünüyor.

Şöyle cevap verdi:

@CodeMaverick Yeni satırlar gömülü olarak metne bağlanıyorsanız, büyük olasılıkla XML sentinelleri değil gerçek karakter 10 (veya 13) olmalıdır. Bu yalnızca XAML dosyalarına gerçek yeni satırlar yazmak istiyorsanız.

Bir ampul söndü!

SQL fonksiyonuma girdim, yeni satırların metinsel gösterimlerimi ...

CHAR( 13 ) + CHAR( 10 )

... dönüştürücüyü TextBlock.Textbağlayıcılığımdan çıkardı ve aynen böyle ... işe yaradı!


9

Bunu yararlı buldum, ancak XAML'de bir "Content = ..." etiketine eklerken bazı hatalarla karşılaştım.

İçeriğin içinde birden fazla satır vardı ve daha sonra bunu belirtmememe rağmen içeriğin beyaz boşluk tuttuğunu öğrendim. böylece bunun üstesinden gelmek ve boşlukları "görmezden gelmesini" sağlamak için böyle uyguladım.

<ToolTip Width="200" Style="{StaticResource ToolTip}" 
         Content="'Text Line 1' 
                   &#x0a;&#x0d;'Text Line 2' 
                   &#x0a;&#x0d;'Text Line 3'"/>

umarım bu başka birine yardım eder.

(Çıktı, aralarında boş bir çizgi bulunan üç metin satırına sahiptir.)


Daha iyi çalışıyor kapalı olabilir <araç ipucu> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ araç ipucu>
Simon_Weaver

5

Bunun daha eski bir soru olduğunu fark ettim ama sadece bunu eklemek istedim

Environment.NewLine

Ayrıca kod yoluyla bunu yaparsa çalışır.


4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

bilmeniz önemli değildir, ancak TextBlock etiketleri arasında belirttiğiniz satır içi içerik olarak adlandırılır ve InlineCollection olan ve Inline türünde öğeler içeren TextBlock.Inlines özelliğine gider. Inline'ın alt sınıfları diğerleri arasında Run ve LineBreak'tir. bkz. TextBlock.Inlines


3

Ayrıca ile çalışmaz

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

Önemli değil, sadece kullanmanız gerekiyor

<TextBlock Text="Cool &#x0a;Newline trick" />

yerine.


1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />

-1

Çözümün arkasındaki kod

private void Button1_Click(object sender, RoutedEventArgs e)
{
    System.Text.StringBuilder myStringBuilder = new System.Text.StringBuilder();
    myStringBuilder.Append("Orange").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Apple").AppendLine();
    myStringBuilder.Append("Banana").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Plum").AppendLine();
    TextBox1.Text = myStringBuilder.ToString();
}
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.