Строки в строку атрибута



Как я могу добавить разрыв строки в текст, когда он задается в качестве атрибута, т. е.:



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


Разбивка его на разнесенный формат не является вариантом для моей конкретной ситуации. Что мне нужно, так это какой-то способ эмулировать следующее:



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

12 ответов:

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

Для представления литерала можно использовать любое шестнадцатеричное кодированное значение. В этом случае я использовал линейную подачу (char 10). Если вы хотите сделать "классический" vbCrLf, то вы можете использовать &#x0d;&#x0a;

Кстати, обратите внимание на синтаксис: это амперсанд, фунт, буква x , затем шестнадцатеричное значение нужного символа и, наконец, точка с запятой.

Также: для полноты можно выполнить привязку к тексту, в который уже встроены каналы строк, как константа в коде., или переменная, построенная во время выполнения.

Возможно, вы можете использовать атрибут xml: space= "preserve" для сохранения пробела в исходном XAML

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

Когда вам нужно сделать это в строке (например: в ваших ресурсах), вы должны использовать xml:space="preserve" и амперсандные коды символов:

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

Вы фактически добавили четыре разрыва строки, возможно, четыре возврата каретки и потенциально замыкающий пробел, который невидим...

Вам нужно просто удалить <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>

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

Обратите внимание, что для этого вам нужно сделать это в текстовом атрибуте, вы не можете использовать содержимое типа

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

Может быть, кто-то предпочитает

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

Я нашел это полезным, но столкнулся с некоторыми ошибками при добавлении его в "Content=...- тег в XAML.

У меня было несколько строк в содержании, и позже я обнаружил, что содержимое содержало пробелы, хотя я этого не уточнял. так что, чтобы обойти это и заставить его "игнорировать" пробелы, я реализовал такой вариант.

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

Надеюсь, что это помогает кто-то другой.

(вывод состоит из трех строк текста с пустой строкой между ними.)

Для тех, кто перепробовал все ответы на этот вопрос и все еще ломает голову над тем, почему ни один из них не работает на вас, вы могли бы столкнуться с формой проблемы, с которой столкнулся я.

Мое свойство 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.Всплывающая подсказка при привязке к полю, в которое встроены каналы строк из SQL sproc.

Он ответил:

@CodeMaverick если вы привязываете к тексту новые строки, они, вероятно, должны быть реальными значениями char 10 (или 13), а не XML-сентинелами. Это только в том случае, если вы хотите написать литеральные новые строки в XAML файлы.

Загорелась лампочка!

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

CHAR( 13 ) + CHAR( 10 )

... удалил конвертер из моей привязки TextBlock.Text, и все так же ... это сработало!

Также не работает с

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

Ничего особенного, просто нужно было использовать

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

Вместо этого.

Я понимаю, что это более старый вопрос, но просто хотел добавить, что

Окружающая среда.Новая строка

Также работает, если делать это через код.

<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

Не то чтобы это важно знать, но то, что вы указываете между тегами TextBlock, называется встроенным содержимым и входит в текстовый блок.Свойство Inlines, которое является коллекцией InlineCollection и содержит элементы типа Inline. Подклассы встроенных и переноса, у других. см.Раздел TextBlock.Inlines

Comments

    Ничего не найдено.