Атрибут рядка в рядку


283

Як я можу додати розрив рядка до тексту, коли він встановлюється як атрибут, тобто:

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

Розбиття його у розірваному форматі не є можливим для моєї конкретної ситуації. Що мені потрібно, це певний спосіб наслідувати наступне:

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

Відповіді:


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

Ви можете використовувати будь-яке шістнадцяткове значення, яке кодується, щоб представити літерал. У цьому випадку я використовував рядок каналу (графік 10). Якщо ви хочете зробити «класику» vbCrLf, то можете використовувати&#x0d;&#x0a;

До речі, зверніть увагу на синтаксис: це амперсанд, фунт, літера x , потім шестинадцяте значення потрібного символу, а потім нарешті крапка з двокрапкою.

ТАКОЖ: Для повноти ви можете прив’язати до тексту, у якому вже вбудовані канали рядків, як константа в коді позаду, або змінна, побудована під час виконання.


14
Мабуть, це не працює в межах <TextBlock.Text> </ TextBlock.Text> Теги.
tcables

45
На сьогоднішній день у мене 34 відгуки на цю відповідь, і мені все одно довелося повернутися і перевірити, оскільки синтаксис такий архаїчний.
Боб Кінг

3
Абсолютно. У мене це закладка. Я мушу постійно приходити перевіряти це.
MojoFilter

4
'Archaic' ==> 'Arcane' :-)
Буде Дін

5
Працює навіть усередині параметра прив'язки при додаванні зворотної косої риси типу: ConverterParameter = 'Тест \ & # x0a; Текст'
Sven

72

Можливо, ви можете використовувати атрибут xml: space = "save" для збереження пробілів у вихідному XAML

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

8
Ви також можете видалити xml: space = "зберегти" та додати <LineBreak /> між рядками
корисноБіть

5
Слід зазначити (через кілька років), що xml:space="preserve"також буде зберігатися відступ пробілів, які зазвичай є у XAML. Таким чином, явне, <LineBreak />як було запропоновано вище, видається більш чистим рішенням.
Зевс

Дякую! Це рішення дуже добре підходило до мого коду серіалізації на основі XAML.
Серафим

О, це спрацювало ідеально. Це врятувало мені стільки коду пластини котла. дякую
iam.Carrot

57

Коли вам потрібно зробити це в рядку (наприклад: у ваших ресурсах), вам потрібно використовувати xml:space="preserve" і коди символів ampersand:

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

Або буквальні новинки в тексті:

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

Попередження: якщо ви пишете код, як другий приклад, ви вставили або нову лінію, або повернення каретки та новий рядок, залежно від закінчень рядків, які використовує ваша операційна система та / або редактор тексту. Наприклад, якщо ви пишете це і зобов’язуєте його git з Linux-систем, все може здатися нормальним - але якщо хтось його клонує до Windows, git перетворить ваші закінчення рядків \r\nі залежно від того, для чого ваша строка ... може зламати світ.

Просто пам’ятайте про це, зберігаючи пробіли. Якщо ви пишете щось подібне:

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

Насправді ви додали чотири розриви рядків, можливо, чотири повернення каретки та потенційно відсталий пробіл, який невидимий ...


10
BTW, ви можете просто застосувати xml:space="preserve"атрибут до ResourceDictionaryзанадто, так що вам не потрібно буде застосовувати його до кожного рядка ресурсу.
ocodo

1
Без амперсанда також працює. Приблизно так: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (з розривом лінії між Першим та Другим рядком)
vgaltes

1
Я б хотів, щоб я міг вам дати +10 заxml:space="preserve"
Тимофій,

1
@trooper Я щойно зробив правки, і це було дозволено Jaykul / мод. А подальша побудова Джейкула справді уточнила незначні деталі тут (оскільки моя редакція не дала бажаного результату так, як хотілося). В цілому, я б сказав, що ця взаємодія допомагає створювати ще кращі відповіді, а не публікувати власні.
Ентоні Лусарді

21

Вам потрібно просто видалити <TextBlock.Text>та просто додати вміст у такий спосіб:

    <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>

введіть тут опис зображення


І питання було " Як я можу додати розрив рядка до тексту, коли він встановлюється як атрибут ", атрибут, а не елемент.
хв.

15

Зауважте, що для цього вам потрібно зробити це в атрибуті Text, ви не можете використовувати такий вміст, як

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

12

Можливо, хтось віддає перевагу

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

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


Хоча додавання & # x0a; здається, працює з XAML, це не з коду. Цей робить.
FDF

11

Для тих, хто намагався відповісти на це запитання і досі чухає голову щодо того, чому жоден з них не працює на вас, ви, можливо, зіткнулися з формою питання, з яким я зіткнувся.

Моє TextBlock.Textвластивість знаходилось всередині ToolTipService.ToolTipелемента, і воно було пов'язане з властивістю об'єкта, дані якого витягувались із процедури, що зберігається в SQL. Тепер дані цього властивості в межах збереженої процедури витягуються з функції SQL.

Оскільки для мене нічого не працювало, я відмовився від пошуку і створив клас перетворювача нижче:

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();
    }
}

Мені довелося скористатися Enivornment.NewLineметодом з відповіді @ dparker . Я доручив перетворювачу шукати будь-яке можливе текстове зображення нового рядка і замінювати його Environment.NewLine.

Це спрацювало!

Однак я все ще був здивований, чому жоден з інших методів не працював із властивостями, пов'язаними з даними.

Я залишив коментар до прийнятої відповіді @ BobKing :

@BobKing - Схоже, це не працює в ToolTipService.ToolTip під час прив'язки до поля, у яке канали рядків вбудовані з паростка SQL.

Він відповів:

@CodeMaverick Якщо ви прив'язуєте текст до нових вбудованих рядків, вони, ймовірно, повинні бути справжніми значеннями 10 значень (або 13), а не сторонніми XML. Це лише в тому випадку, якщо ви хочете записати буквально нові рядки у файли XAML.

Лампочка згасла!

Я зайшов у свою функцію SQL, замінив мої текстові подання нових рядків на ...

CHAR( 13 ) + CHAR( 10 )

... зняв конвертер з мого TextBlock.Textприв'язки, і просто так ... він працював!


9

Я вважаю це корисним, але зіткнувся з деякими помилками, додавши його до тегу "Вміст = ..." у XAML.

У мене було кілька рядків у вмісті, і пізніше я з’ясував, що вміст зберігає пробіли, хоча я цього не вказував. тож, щоб обійти це і маючи "ігнорувати" пробіли, я реалізував таке, як це.

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

сподіваюся, що це допоможе комусь іншому.

(Вихід має три рядки з порожнім рядком між ними.)


вам може бути краще спробувати <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver

5

Я усвідомлюю, що це старіше питання, але просто хотів це додати

Середовище.NewLine

також працює, якщо це робити за допомогою коду.


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

не те, що важливо знати, але те, що ви вказуєте між тегами TextBlock, називається вбудованим вмістом і переходить у властивість TextBlock.Inlines, яка є InlineCollection і містить елементи типу Inline. Підкласи Inline - Run та LineBreak, серед інших. див. TextBlock.Inlines


3

Також не працює

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

Нічого великого, просто потрібно використовувати

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

замість цього.



-1

Код за рішенням

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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.