2010-02-28 6 views
4

Lorsque j'exécute mon programme pour la première fois et que je tape du texte dans la zone richtext, si j'appuie sur enter, le carat est déplacé vers une nouvelle ligne, puis appuyez sur retour arrière au lieu de la ligne précédente. recule d'un espace même si je n'ai tapé aucun texte sur cette nouvelle ligne. Je ne peux pas comprendre ce qui se passe. Qu'est-ce que je fais mal? Et comment puis-je le réparer?RichTextBox ne fonctionne pas correctement

Edit:

On dirait que le richtextbox ajoute une espace devant le premier caractère quand je commence à taper et un espace est ajouté devant chaque nouvelle ligne que je fais. Je ne peux pas placer le carat devant l'espace en cliquant dessus, mais je peux le supprimer en utilisant le retour arrière et tout redevient normal.

Edit 2: Voici le code qui semble être la cause du problème, mais je ne peux pas comprendre pourquoi il fait que:

<RichTextBox.Resources> 
    <Style TargetType="{x:Type Paragraph}"> 
      <Setter Property="Margin" Value="5"/> 
    </Style> 
</RichTextBox.Resources> 
+1

Comment peut-il retourner dans un espace si vous n'avez rien tapé sur la nouvelle ligne? D'où vient l'espace? – slugster

+0

C'est mon problème. Je n'ai aucune idée de comment c'est possible. Quand il revient dans un espace le carat est dans une position qu'il ne devrait pas pouvoir aller. – Justin

+0

Voulez-vous dire qu'il est hors des limites de la RichTextBox? Où est le carat? Pouvez-vous montrer une capture d'écran? –

Répondre

4

Ce n'est pas comment les RichTextBox se comporte si je mets juste cette dans Kaxaml:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
    <RichTextBox/> 
    </Grid> 
</Page> 

Cela m'amène à soupçonner qu'il y a quelque chose d'autre qui se passe avec votre code. Qu'Est-ce que c'est?

Edit:

Bon, d'accord, il est clair pourquoi vous obtenez le « espace » devant le caret: vous appliquez un style aux paragraphes qui définit une marge. Ce qui n'est pas clair à tous est pourquoi appuyer sur BACKSPACE le fait disparaître.

Comment résoudre un problème comme celui-ci: Ajoutez un gestionnaire d'événement à votre RichTextBox (je KeyUp), et utiliser XamlWriter pour vider sa propriété Document-Console.Out. Vous verrez que quand il est d'abord peuplée, la Document contient:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Paragraph /> 
</FlowDocument> 

Après avoir frappé BACKSPACE, il ressemble à ceci:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Paragraph Margin="0,5,5,5" /> 
</FlowDocument> 

Il est beaucoup plus apparent ce qui se passe si vous définissez la marge dans votre style à 50 au lieu de 5. L'espace que vous voyez devant le paragraphe est en fait la marge gauche du paragraphe, définie par le style dans le dictionnaire de ressources du RTB. Comme le paragraphe n'a aucune propriété locale Margin, il hérite de la marge du style.

Lorsque vous appuyez sur RETOUR ARRIÈRE, la marge de gauche est définie sur 0. Cela donne à la propriété Margin du paragraphe une valeur locale, de sorte qu'elle cesse d'hériter du style.

Si vous appuyez sur ENTRÉE et ajoutez un nouveau paragraphe, le nouveau paragraphe copie les marges du paragraphe précédent. Donc, essentiellement, votre style cesse de fonctionner.

Cela semble être un bug dans la façon dont le RTB implémente EditingCommands.Backspace. Ce que cette commande est censée faire, officiellement:

Lorsqu'elle est invoquée sur une sélection vide, cette commande supprime le caractère ou le séparateur de paragraphe juste avant le signe insertion. Lorsqu'elle est appelée sur une sélection non vide, cette commande supprime la sélection.

Cette commande conserve le formatage de la sélection supprimée pour le contenu immédiatement inséré au même emplacement après l'invocation de cette commande.

Je pense qu'il est assez clair que ce n'est pas ce qu'il fait réellement. En fait, si vous définissez la marge à 50, il devient clair que lorsque le signe est au début d'un paragraphe avec une marge et que vous appuyez sur RETOUR ARRIÈRE, il réduit la marge gauche de ce paragraphe de 20. Je ne vois aucune justification documentée pour ce comportement.

Alors, que pouvez-vous faire à ce sujet? Cela dépend en quelque sorte de la raison pour laquelle vous définissez cette marge en premier lieu. D'après votre description originale, il semble que vous pensiez que c'est la marge, et pas le fait que BACKSPACE le fasse disparaître, c'est le bug. Eh bien, c'est assez facile à réparer; se débarrasser de ce style.

Mais si vous avez besoin de cette marge pour une raison quelconque, je ne sais pas quoi vous dire.

+0

J'ai trouvé le code incriminé et l'ai posté comme un edit à ma question. Bien que j'ai trouvé où le problème est localisé je ne peux toujours pas comprendre pourquoi cela se produit. – Justin

+0

Merci beaucoup! – Justin

Questions connexes