Использование WPF WrapPanel для переноса и выравнивания текста по правому краю - Ошибка WPF? - PullRequest
2 голосов
/ 20 июля 2010

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

Пример с текстом = обычный текст (другой текст):

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

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

Пример кода:

<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?Как?

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

Ответы [ 2 ]

4 голосов
/ 20 июля 2010

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

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

3 голосов
/ 20 июля 2010

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

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

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

...