कैसे एक wpf TextBlock नियंत्रण में एक नई लाइन डाल करने के लिए?


102

मैं XML फ़ाइल से टेक्स्ट ला रहा हूं, और मैं कुछ नई लाइनें सम्मिलित करना चाहता हूं, जिनकी व्याख्या टेक्स्टब्लॉक रेंडर नई लाइनों के रूप में करता है।

मैंने कोशिश की:

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

लेकिन डेटा अभी भी नई लाइन के बिना प्रदर्शित किया जाता है। मैंने C # के <data>माध्यम से .Textसंपत्ति के माध्यम से सामग्री सेट की ।

GUI में नई लाइन रेंडर करने के लिए मुझे XML में क्या डालने की आवश्यकता है?

मैंने XAML में टेक्स्ट को मैन्युअल रूप से सेट करने के लिए कुछ इस तरह की कोशिश की है:

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

और जब कूटबद्ध चरित्र जीयूआई में प्रकट नहीं होता है तो यह मुझे एक नई पंक्ति भी नहीं देता है।


क्या आपने "उद्धरण" <डेटा> फू बार बाज "\ n"
बाज

@DJKRAZE: उद्धरण कुछ भी नहीं करते हैं, न ही आर और एन एक साथ करते हैं। : एस
ओनली बोलिवियन हियर

@BalamBalam: यह एक ही नहीं है, यह सवाल टेक्स्ट विशेषता के बारे में है।
एचबी

मैं देखता हूं कि मैं पूरी तरह से समझता हूं कि "" अब काम क्यों नहीं करेगा .. मैं मान रहा हूं <LineBreak> तब शाब्दिक / कुंजी शब्द की तरह अधिक होगा। मेरी गलती .. शानदार जवाब HB
MethodMan

दान वोगेल ने काम करने के समाधान तक की तारीख तय की। WPF \ n r \\ n में \ r \ n की व्याख्या करता है।
ज़ॉर्ग एलेक्स

जवाबों:


174

आप डेटा में एक नई लाइन डालने की कोशिश कर सकते हैं:

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

यदि वह काम नहीं करता है तो आपको स्ट्रिंग को मैन्युअल रूप से पार्स करने की आवश्यकता हो सकती है।

अगर आपको सीधे XAML की जरूरत है तो यह आसान है:

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

नहीं, यह कुछ भी नहीं करता है। मैंने भी TextBlock के XAML के अंदर की सामग्रियों को नई पंक्तियों के रूप में दर्ज प्रेस के साथ चिपका दिया है और यह अभी भी इसे एक ही बार में प्रदर्शित करता है।
केवल बोलिवियन यहां

3
@SergioTapia: कुछ डेटा फ़ाइल और XAML में ब्रेक होने के बीच एक अंतर है, XAML पार्सर व्हाट्सएप को अनदेखा करता है, लेकिन यदि आप, उदाहरण के लिए, XmlSerializerब्रेक का उपयोग करते हुए कुछ XML का deserialize बनाए रखा जाएगा। Xaml में आपको जरूरत है <LineBreak/>
HB

नई लाइन सीधे डेटा में डालें ... बिल्कुल! यहाँ मैंने बहुत समय बिताया \ n, <LineBreak />, और बिना किसी लाभ के html कोड के टन की कोशिश की। मुझे पहले सरल दृष्टिकोण की कोशिश करनी चाहिए थी।
देलहिक्स नोव

65

पूर्णता के लिए: आप यह भी कर सकते हैं:

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

x0A बची हुई हेक्साडेसिमल लाइन फीड है। \ N के बराबर


2
इस तरह से एक परिदृश्य में बांधने में उपयोगी: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} नाम: {0} & # x0a; कोड: {1}"> <yw पथ = "नाम" / > <बाइंडिंग पथ = "कोड" /> </ MultiBinding> </TextBlock.Text> </ TextBlock>
rajibdotnet

3
यह सबसे अच्छा जवाब है
औरेलियो एंटोनियो

मैं इस लिंक को जोड़ूंगा : stackoverflow.com/questions/9021649/… उत्तर के लिए एक स्पष्टीकरण।
I.Step

22

आप बाइंडिंग का भी उपयोग कर सकते हैं

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

और MyText को इस तरह सेट करें:

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

9
आपको स्ट्रिंग की आवश्यकता भी नहीं है। फ़र्मैट ()। "मेरा पाठ \ n आपका पाठ" लौटाएँ; ठीक काम करता है।
राशि चक्र

18

तुम्हें अवश्य उपयोग करना चाहिए

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

या यदि आप पसंद करते हैं:

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

बाहर देखें: यदि आप दोनों का उपयोग करते हैं और 10 और आप अपने पाठ में अगली पंक्ति पर जाते हैं, तो आपके पास दो खाली लाइनें होंगी।

यहाँ विवरण के लिए: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

भले ही यह एक पुराना सवाल है, मैं अभी समस्या पर आया हूं और इसे दिए गए उत्तरों से अलग तरीके से हल किया है। हो सकता है कि यह दूसरों के लिए मददगार हो।

मैंने देखा कि भले ही मेरी XML फाइलें दिखती थीं:

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

जब इसे मेरे C # कोड में पढ़ा गया तो स्ट्रिंग में डबल बैकस्लैश थे।

\\r\\n

इसे ठीक करने के लिए मैंने एक्स्ट्रा बैकस्लैश को स्ट्रिप करने के लिए ValueConverter लिखा।

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 पर XAML में जोड़ने के लिए TextWrapping="Wrap"(और AcceptsReturn="True"अगर यह एक TextBox था) होने के साथ, आपके पास यह सही था, और इसका उत्तर होना चाहिए - लेकिन .Replace()डेटाबेस से आने वाले मूल्य पर ऐसा करने के लिए कहें - कोई ज़रूरत नहीं है फैंसी फ़ंक्शन: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); रिटर्न कुंजी का उपयोग करके दर्ज किए गए किसी भी मूल्य को डीबी को ठीक लिखा जाएगा - यह तब होता है जब समस्याओं का कारण होने वाले मूल्य को प्रदर्शित करने के लिए सी # इसे पकड़ लेता है, जैसा कि आपने उल्लेख किया है। इसलिए इसे पाठ का अधिभार कहा जाना चाहिए।
vapcguy

10

यदि अन्य सभी विफल रहता है, तो आप भी उपयोग कर सकते हैं

"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 का उपयोग करना एकमात्र उपाय है जो मेरे लिए काम करता है। जब मैंने \ r \ n की कोशिश की, तो यह पाठ बॉक्स में वास्तविक \ r \ n दोहराया।


0

आपको यह सुनिश्चित करना होगा कि टेक्स्टब्लॉक में यह विकल्प सक्षम है:

AcceptsReturn="True"

एक्सेप्ट रीटर्न केवल टेक्स्टबॉक्स के लिए होता है, टेक्स्टब्लॉक के लिए नहीं
स्टीव

0

इस तरह से एक "लाइन ब्रेक" या एक रिचटेक्स्टबॉक्स "आरटीबी" में "पैराग्राफ ब्रेक" डालें:

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

NewLine आइटम प्राप्त करने का एकमात्र तरीका पहले "\ r \ n" आइटम के साथ पाठ सम्मिलित करना है, और फिर अधिक कोड लागू करना जो चयन और / या TextRange ऑब्जेक्ट पर काम करता है। यह सुनिश्चित करता है कि \ par आइटम \ पंक्ति आइटम में कनवर्ट किए जाते हैं, वांछित के रूप में सहेजे जाते हैं, और * .Rtf फ़ाइल को फिर से खोलते समय अभी भी सही हैं। यही मैंने बहुत कोशिशों के बाद पाया। TextPointer आइटम ((.St .End .ContentStart .ContentEnd) जहां लाइन्स और ब्रेक्स जाने चाहिए, जिन्हें मैंने अपने उद्देश्यों के लिए सफलता के साथ प्राप्त किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.