2010-07-20 14 views
2

J'essaie d'utiliser le WrapPanel et deux TextBlocks pour ajouter un astérisque (*) sur le côté gauche d'un texte, permettre au texte d'envelopper et forcer le texte à être aligné à droite. Je l'ai fait avec succès en créant un WrapPanel avec le FlowDirection défini à RightToLeft et en ajoutant mon texte, suivi de l'astérisque. Cependant, si le texte que j'utilise contient des caractères non alphanumériques à la fin de la ligne, il est inexplicablement forcé à l'avant de la ligne. Je trouve ce comportement très étrange. Je pense que ce doit être un bug dans WPF et pas un comportement prévu.Utilisation du WrapPanel WPF pour boucler et aligner correctement le texte - Bug WPF?

Exemple avec Text = Texte normal (Autre texte):

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

Ne hésitez pas à utiliser le code exemple suivant pour recréer le problème par vous-même. Placez simplement ceci dans une fenêtre avec Height et Width = 100, puis tapez "Normal Text (Other Text)" dans le TextBox. Ou, définissez la Hauteur et la Largeur sur ce que vous voulez et écrivez suffisamment de texte pour qu'il soit forcé d'envelopper le texte, puis ajoutez la ponctuation à la fin.

Exemple de code:

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

Alors, ma question (s).

  • Est-ce un bug, ou est-ce prévu?
  • Si c'est un bogue, devrais-je le soumettre à Microsoft d'une manière ou d'une autre? Comment?

Depuis que j'ai commencé ce post, j'ai décidé de placer les deux TextBlocks dans une grille à deux colonnes. Avec le non-astérisque contenant TextBlock configuré pour utiliser un Right TextAlignment je réponds à toutes mes exigences de toute façon. Pourtant, j'ai trouvé que c'était un problème intéressant.

Répondre

3

Essayez ceci:

<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 est destiné à soutenir les langues qui sont lus que de droite à gauche. Puisque je ne connais pas les règles pour des langues comme ça, je ne vais pas prétendre comprendre pourquoi vous voyez ce que vous êtes, ou si c'est un bug. Cela dit, je sais que changer la FlowDirection n'est pas la bonne façon de gérer l'alignement droit des langues de gauche à droite et vous devriez utiliser HorizontalAlignment à la place.

(Pour référence ultérieure, vous signalez les bogues à Microsoft à travers le Connect site)

+0

Fonctionne bien! Comme c'est souvent le cas avec une logique alambiquée comme mon RightToLeft FlowDirection, il y a une façon beaucoup plus simple de le faire. Je l'aime mieux que la grille que j'ai décrite. Est-ce que cela vaut la peine de signaler le comportement étrange à Microsoft? – Drew

+1

@Drew On dirait que c'est le comportement attendu. Comme je le dis, je ne sais rien à ce sujet, mais un peu Google a trouvé ce lien: http://www.i18nguy.com/markup/right-to-left.html –

+0

Je ne peux pas dire que je vraiment comprendre les règles pour changer une langue de gauche à droite à droite à gauche, mais je suis vendu que c'était un comportement intentionnel. Bien joué. – Drew

3

En .Net 4 (WPF4) pistes sont bindable, de sorte que vous pouvez essayer quelque chose comme ceci:

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

Les deux Run Les éléments sont sur la même ligne car tout type d'espace entre les limites de l'étiquette provoquera l'apparition d'un espace entre les deux exécutions. (Comme le fait le HTML.)