Вертикальный текст в Wpf TextBlock

В духе оригинального вопроса:

Я бы хотел сравнить два массива ... идеально, эффективно.

blockquote>

Я выполнял тесты производительности на некоторые из более простых предложений, предложенных здесь, со следующими результатами (быстрый до медленного):

, а (67%) - Tim Down

var i = a1.length;
while (i--) {
    if (a1[i] !== a2[i]) return false;
}
return true

каждый (69 %) пользователем2782196

a1.every((v,i)=> v === a2[i]);

уменьшить (74%) с помощью DEI

a1.reduce((a, b) => a && a2.includes(b), true);

join & amp; toString (78%) Gaizka Allende & amp; vivek

a1.join('') === a2.join('');

a1.toString() === a2.toString();

half toString (90%) от Victor Palomo

a1 == a2.toString();

stringify (100%) на radtek

JSON.stringify(a1) === JSON.stringify(a2);

Обратите внимание, что приведенные ниже примеры предполагают, что массивы отсортированы, одномерные массивы. Сравнение .length было удалено для общего теста (добавьте a1.length === a2.length к любому из предложений, и вы получите повышение производительности на 10%). Выберите любые решения, которые лучше всего подходят для вас, зная скорость и ограничение каждого из них.

Несвязанное примечание: интересно видеть, как люди получают все триггер-счастливые Джон Уэйнс при снижении голосов на вполне законные ответы на этот вопрос.

blockquote>

43
задан MarioH 9 December 2008 в 01:34
поделиться

6 ответов

Никто еще никто не упомянул очевидный и тривиальный способ укладывать буквы произвольной струны вертикально (не вращая их) с помощью чистого XAML:

<ItemsControl
  ItemsSource="Text goes here, or you could use a binding to a string" />

это просто отказывается от текста вертикально, распознавая тот факт, что строка является iEnumerable И поэтому itemsControl может относиться к каждому символу в строке как отдельный элемент. Панель по умолчанию для itemsControl - это StackPanel, поэтому символы выложены вертикально.

Примечание. Для точного контроля над горизонтальным расположением, вертикальным расстоянием и т. Д., ItemContainerStyle и ItemTemplate Properties могут быть установлены на элементахControl.

73
ответ дан 26 November 2019 в 22:28
поделиться

Это выполнимо:

Ваш TextBlock TextAlignment свойство должно быть установлено на Center:

<TextBlock Name="textBlock1" TextAlignment="Center" Text="Stacked!" />

Тогда добавляют NewLine с между каждым символом:

textBlock1.Text =
    String.Join(
        Environment.NewLine,
        textBlock1.Text.Select(c => new String(c, 1)).ToArray());

(Использование System.Linq для создания массива строк из отдельных символов в исходной строке. Я уверен, что существуют другие способы сделать это...)

4
ответ дан Christoffer Lette 23 September 2019 в 12:07
поделиться

Вот способ вставить '\n' после каждого символа в тексте TextBlock, тот способ заставить его отобразиться вертикально:

<TextBlock x:Name="VertTextBlock" Text="Vertical Text" Loaded="VertTextBlock_Loaded"></TextBlock>

Затем в Загруженном обработчике событий, Вы говорите:

TextBlock tb = sender as TextBlock;
StringBuilder sb = new StringBuilder(tb.Text);
int len = tb.Text.Length * 2;

for (int i = 1; i < len; i += 2)
{
    sb.Insert(i, '\n');
}

tb.Text = sb.ToString();

, Что решение было предложено Lette, но я верю, моя реализация подвергается меньше служебному.

0
ответ дан Boyan 23 September 2019 в 12:07
поделиться

Я не думаю, что существует простое из выполнения этого withought изменение путем системы по сути laysout текст. Самое легкое решение состояло бы в том, чтобы изменить ширину textblock и предоставить несколько дополнительных свойств как это:

<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>

Это - hacky, но он действительно работает.

18
ответ дан Micah 23 September 2019 в 12:07
поделиться
<linebreak/> can be used to show data in two lines
0
ответ дан 26 November 2019 в 22:28
поделиться

На всякий случай, если кто-нибудь все еще наткнутся на этот пост ... вот простое 100% XAML-решение.

    <TabControl TabStripPlacement="Left">
        <TabItem Header="Tab 1">
            <TabItem.LayoutTransform>
                <RotateTransform Angle="-90"></RotateTransform>      
            </TabItem.LayoutTransform>
            <TextBlock> Some Text for tab 1</TextBlock>
        </TabItem>
        <TabItem Header="Tab 2">
            <TabItem.LayoutTransform>
                <RotateTransform Angle="-90"></RotateTransform>
            </TabItem.LayoutTransform>
            <TextBlock> Some Text for tab 2</TextBlock>
        </TabItem>
    </TabControl>
22
ответ дан 26 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: