2010-07-20 3 views
2

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

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

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

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

Пример кода:

<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, настроенная для использования права TextAlignment, я все равно отвечаю всем моим требованиям. Тем не менее, я нашел это интересной проблемой.

ответ

3

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

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

+0

Отлично работает! Как это часто бывает со сложной логикой, например, с RightToLeft FlowDirection, есть гораздо более простой способ сделать это. Мне нравится это лучше, чем сетка, которую я описал. Стоит ли мне сообщать о нечетном поведении Microsoft? – Drew

+1

@Drew Похоже, что это ожидаемое поведение. Как я уже сказал, на самом деле я ничего не знаю об этом, но немного Гуглинг нашел эту ссылку: http://www.i18nguy.com/markup/right-to-left.html –

+0

Я не могу сказать, что я действительно понять правила изменения языка слева направо на право-налево, но я продал, что это было предназначено для поведения. Отлично сработано. – Drew

3

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

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

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