Использование WPF WrapPanel для переноса и выравнивания текста по правому краю - ошибка WPF?

Я пытаюсь использовать WrapPanel и два TextBlocks, чтобы добавить звездочку (*) к левой стороне некоторого текста, разрешить перенос текста и принудительно выровнять текст по правому краю. Я успешно сделал это, создав WrapPanel с FlowDirection, установленным на RightToLeft, и добавив свой текст со звездочкой. Однако, если текст, который я использую, содержит какие-либо не буквенно-цифровые символы в конце строки, он необъяснимым образом помещается в начало строки. Я считаю такое поведение очень странным. Я думаю, что это ошибка в WPF, а не предполагаемое поведение.

Пример с текстом = нормальный текст (другой текст):

Expected:
* Normal Text (Other
               Text)
Actual:
* Normal Text (Other
               (Text

Не стесняйтесь использовать следующий пример кода, чтобы воссоздать проблему самостоятельно. Просто поместите это в окно с высотой и шириной = 100, затем введите «Обычный текст (другой текст)» в текстовое поле. Или установите для высоты и ширины все, что вам нравится, и напишите достаточно текста, чтобы он был вынужден обернуть текст, а затем добавьте знаки препинания в конце.

Образец кода:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBox Name="input" />
    <WrapPanel Grid.Row="2" FlowDirection="RightToLeft">
        <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/>
        <TextBlock Text="*" Margin="0,0,3,0"/>
    </WrapPanel>
</Grid>

Итак, мой вопрос (ы).

  • Это ошибка или это задумано?
  • Если это ошибка, следует ли мне каким-то образом отправить ее в Microsoft? Как?

Начиная с этого поста, я решил вместо этого поместить два TextBlocks в сетку из двух столбцов. С не-звездочкой, содержащей TextBlock, настроенной на использование Right TextAlignment, я в любом случае удовлетворяю всем своим требованиям. Тем не менее, я нашел это интересным вопросом.


person Drew    schedule 20.07.2010    source источник


Ответы (2)


Попробуйте вместо этого:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBox Name="input" />
    <WrapPanel Grid.Row="2" HorizontalAlignment="Right" >
        <TextBlock Text="*" Margin="0,0,3,0"/>
        <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/>

    </WrapPanel>
</Grid>

FlowDirection используется для поддержки языков, которые читаются справа налево. Поскольку я не знаю правил для подобных языков, я не собираюсь делать вид, что понимаю, почему вы видите то, что вы есть, или это ошибка. Тем не менее, я знаю, что изменение FlowDirection - неправильный способ обработки выравнивания по правому краю языков слева направо, и вместо этого вам следует использовать HorizontalAlignment.

(Для дальнейшего использования вы отправляете сообщения об ошибках в Microsoft через сайт Connect)

person Martin Harris    schedule 20.07.2010
comment
Работает отлично! Как это часто бывает с запутанной логикой, такой как мой RightToLeft FlowDirection, есть гораздо более простой способ сделать это. Мне она нравится больше, чем описанная мною сетка. Стоит ли мне сообщать о странном поведении в Microsoft? - person Drew; 20.07.2010
comment
@Drew Похоже, это ожидаемое поведение. Как я уже сказал, я на самом деле ничего об этом не знаю, но небольшой поиск в Google нашел эту ссылку: i18nguy.com/markup/right-to-left.html - person Martin Harris; 20.07.2010
comment
Я не могу сказать, что действительно понимаю правила изменения языка слева направо на справа налево, но я убежден, что это было запланированное поведение. Отличная работа. - person Drew; 20.07.2010

В .Net 4 (WPF4) запуски могут быть привязаны, поэтому вы можете попробовать что-то вроде этого:

<TextBlock TextAlignment="Right" TextWrapping="Wrap">
    <Run Text="*" /><Run Text="{Binding ElementName=Input, Path=Text}" />
</TextBlock>

Два элемента Run находятся в одной строке, потому что любой тип пробелов между границами тегов приведет к появлению пробела между двумя запусками. (Как это делает HTML.)

person YotaXP    schedule 20.07.2010