2009-10-19 13 views
2

J'essaie actuellement de créer des fonctionnalités de base de traitement de texte dans un projet WPF. J'utilise un RichTextBox et suis conscient de tous les EditingCommands (ToggleBold, ToggleItalic ... ect.). La chose sur laquelle je suis bloqué est de permettre à l'utilisateur de changer la police et la police comme dans MS Office où la valeur change uniquement pour le texte sélectionné et s'il n'y a pas de texte sélectionné, la valeur changera pour la position actuelle du curseur. Je suis venu avec une quantité décente de code pour que cela fonctionne, mais j'ai des problèmes avec le truc de texte non sélectionné. Voici ce que je fais pour la RichTextBox.Selection.WPF Richtextbox FontFace/FontSize

TextSelection text = richTextBox.Selection; 
if (text.IsEmpty) 
{ 
    //doing this will change the entire word that the current caret position 
    //is on which is not the desire/expected result. 
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value); 
} 
else 
    //This works as expected. 
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value); 

Alors, ma question est comment dois-je faire cela? Existe-t-il un moyen meilleur/plus pratique de le faire? Une idée que j'avais était que je devrais insérer une nouvelle ligne dans le paragraphe, mais je ne pouvais pas comprendre comment faire cela. Toute aide est appréciée. Je vous remercie.


déni de responsabilité: Ceci est une republication exacte de this question il y a 7 mois. Je l'ai trouvé en cherchant une solution au même problème, mais cette question n'a pas été résolue et j'espère que quelqu'un pourra y répondre maintenant.

Répondre

0

OK, vient de trouver la réponse:

private void ChangeTextProperty(DependencyProperty dp, string value) 
    { 
     if (mainRTB == null) return; 

     TextSelection ts = richTextBox.Selection; 
     if (ts!=null) 
      ts.ApplyPropertyValue(dp, value); 
     richTextBox.Focus(); 
    } 
2

Essayez ceci:

private void ChangeTextProperty(DependencyProperty dp, string value) 
      { 
       if (mainRTB == null) return; 
       TextSelection ts = mainRTB.Selection; 
       if (ts.IsEmpty) 
       { 
        TextPointer caretPos = mainRTB.CaretPosition; 
        TextRange tr = new TextRange(caretPos, caretPos); 
        tr.Text = " "; 
        tr.ApplyPropertyValue(dp, value); 
       } 
       else 
       { 
        ts.ApplyPropertyValue(dp, value); 
       } 
      } 

J'espère que le tour est joué

+0

Je l'ai considéré cette option, mais il ajoute un espace blanc à la fin du texte. Si je supprime cet espace après, l'effet de changement de police est parti. – Elad

1

Vous pouvez re-définir explicitement le focus sur le RichTextBox en appelant sa méthode Focus() après avoir appliqué la nouvelle valeur à TextRange, ou mieux encore, rendre les éléments de la barre d'outils non focalisables. par exemple, si vous avez un combobox pour les tailles de police:

<ComboBox x:Name="FontSizeSelector" Focusable="False" /> 

Ensuite, vous pouvez simplement utiliser le code d'origine, sans qu'il soit nécessaire d'appeler mise au point():

text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value); 
Questions connexes