8
votes

C # RTB - Coller le texte brut sans couleurs / polices?

J'utilise un objet texte riche dans mon application C #. Le seul problème que j'ai d'avoir est que lorsque l'utilisateur pâte a formé du texte d'une autre application, il reste formé que je ne peux pas avoir. Y a-t-il un moyen de coller uniquement une chaîne et d'ignorer le formatage? Merci!


1 commentaires

@Tomas a ajouté un deuxième exemple de code qui insère le contenu du presse-papiers au point d'insertion actuel de la RichTextBox, puis met à jour le point d'insertion à juste après le texte ajouté. Deuxième exemple illustre également l'utilisation de la disposition de suspension / de reprise afin d'éviter un effet clignotant de la réinitialisation du contenu de RichTextBox. Assurez-vous et testez avec une variété de types d'entrées formatées: à nouveau, cela n'est pas complètement testé à un niveau où je l'utiliserais dans le code de production sans effectuer d'autres tests.


10 Réponses :


10
votes

Assumant Winforms: Essayez ceci: Définissez une richtextbox avec un gestionnaire d'événements de clé comme ceci:

Exemple d'annexe: P>

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.V)  
    { 
            // suspend layout to avoid blinking
            richTextBox2.SuspendLayout();

            // get insertion point
            int insPt = richTextBox2.SelectionStart;

            // preserve text from after insertion pont to end of RTF content
            string postRTFContent = richTextBox2.Text.Substring(insPt);

            // remove the content after the insertion point
            richTextBox2.Text = richTextBox2.Text.Substring(0, insPt);

            // add the clipboard content and then the preserved postRTF content
            richTextBox2.Text += (string)Clipboard.GetData("Text") + postRTFContent;

            // adjust the insertion point to just after the inserted text
            richTextBox2.SelectionStart = richTextBox2.TextLength - postRTFContent.Length;

            // restore layout
            richTextBox2.ResumeLayout();

            // cancel the paste
            e.Handled = true;
    } 
} 


5 commentaires

N'oubliez pas que le code ci-dessus suffit à ajouter le texte à la fin du contenu de la RTF actuel; Pour une utilisation du monde réel, vous voudrez probablement gérer le cas où vous souhaitez que le texte collé soit insérer au point d'insertion actuel de la RichTextBox (très facile à faire). J'ai testé le code pour m'assurer qu'aucune erreur n'est lancée si le presse-papiers est "vide": pas de problème là-bas.


Je pense qu'une solution ajustée pour filtrer constamment le contenu. Si le texte riche arrive dans une durée inhumaine (c'est-à-dire collé), convertissez-le au texte régulier.


Lorsque vous avez sélectionné quelque chose et appuyez sur Ctrl + V, vous vous attendez à ce que l'ancienne sélection soit remplacée par des contenus de presse-papiers, mais dans votre solution, il est ajouté. À la manière dont la solution @NQK 2 lignes fonctionne bien)


Petite correction: POSTRTFContent doit effectivement être remplie de richtextbox2.text.substring (instinct + richtextbox2.selectionlength) , de sorte que le texte sélectionné est remplacé sur Coller comme il se doit. En outre, l'insert de décors de raccourci de Coller legacy Coller devrait être ajouté en tant que combinaison de touches.


En outre, j'ai trouvé que malgré le suspendlayout () , la modification du texte mettra à jour le contrôle de toute façon. Le meilleur moyen d'empêcher que cela soit de faire quelques modifications de la propriété de texte que possible, en composant d'abord la chaîne, puis en l'affectant une fois.



32
votes

Ajoutez un gestionnaire à la touche code> code> -Event pour intercepter la pâte standard et insérer manuellement uniquement le texte brut:

private void rtb_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.V)
    {
        ((RichTextBox)sender).Paste(DataFormats.GetFormat("Text"));
            e.Handled = true;
    }
}


1 commentaires

Ohh. Parfait. Besoints Maj + Insérer une manipulation aussi.



0
votes

Eh bien, la propriété RichTextbox a une propriété Selectionfont afin que vous puissiez, par exemple, procédez comme suit: xxx

Si un texte est collé, il sera automatiquement formaté. < / p>


0 commentaires

0
votes

Vous pouvez également utiliser

private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.V)
    {
        richTextBox1.SelectedText = (string)Clipboard.GetData("Text");
        e.Handled = true;
    }
}


1 commentaires

Envisagez d'élargir votre réponse pour expliquer à l'administrateur pourquoi cela atteint le résultat souhaité, éventuellement reliant la documentation. Comme c'est que cela ne soit que légèrement utile.



5
votes

Je cherchais un Richtextbox Code> mais je n'ai pas trouvé la solution en ligne.

Pourquoi blindez uniquement richtextbox code> au lieu d'un texte code>? Par exemple, parce que richtextbox code> a une fonctionnalité d'annulation / redo utilisable et bien plus encore. P>

Enfin j'ai trouvé une solution parfaite en creusant dans les fichiers d'en-tête C de la commande richedit: un Richtextbox Code> peut être commuté en mode plainte, après cela, il n'accepte pas de texte et d'images formatés, ainsi que des éléments similaires dans le presse-papiers et se comporte comme une zone de texte normale code> en formatage. Les choses fantaisistes comme des images ne peuvent pas être collées et il pâte du texte formaté en supprimant le formatage. P>

class PlainRichTextBox : RichTextBox
{
    const int WM_USER = 0x400;
    const int EM_SETTEXTMODE = WM_USER + 89;
    const int EM_GETTEXTMODE = WM_USER + 90;

    // EM_SETTEXTMODE/EM_GETTEXTMODE flags
    const int TM_PLAINTEXT = 1;
    const int TM_RICHTEXT = 2;          // Default behavior 
    const int TM_SINGLELEVELUNDO = 4;
    const int TM_MULTILEVELUNDO = 8;    // Default behavior 
    const int TM_SINGLECODEPAGE = 16;
    const int TM_MULTICODEPAGE = 32;    // Default behavior 

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

    bool m_PlainTextMode;

    // If this property doesn't work for you from the designer for some reason
    // (for example framework version...) then set this property from outside
    // the designer then uncomment the Browsable and DesignerSerializationVisibility
    // attributes and set the Property from your component initializer code
    // that runs after the designer's code.
    [DefaultValue(false)]
    //[Browsable(false)]
    //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public bool PlainTextMode
    {
        get
        {
            return m_PlainTextMode;
        }
        set
        {
            m_PlainTextMode = value;
            if (IsHandleCreated)
            {
                IntPtr mode = value ? (IntPtr)TM_PLAINTEXT : (IntPtr)TM_RICHTEXT;
                SendMessage(Handle, EM_SETTEXTMODE, mode, IntPtr.Zero);
            }
        }
    }

    protected override void OnHandleCreated(EventArgs e)
    {
        // For some reason it worked for me only if I manipulated the created
        // handle before calling the base method.
        PlainTextMode = m_PlainTextMode;
        base.OnHandleCreated(e);
    }
}


0 commentaires

-2
votes

simple, mais tout dans le presse-papiers est en texte brut lorsque l'application est ouverte.

private void timer2_Tick(object sender, EventArgs e)
        {
            string paste = Clipboard.GetText();
            Clipboard.SetText(paste);
        }


0 commentaires

0
votes

Je l'ai atteint par udpating la police et la couleur de l'ensemble du RTB lorsque son contenu est modifié. Cela fonctionne bien pour moi lorsque la boîte d'entrée n'a pas besoin de traiter d'énormes quantités de texte.

public FormMain()
{
    InitializeComponent();
    txtRtb.TextChanged += txtRtb_TextChanged;
}

void txtRtb_TextChanged(object sender, EventArgs e)
{
    RichTextBox rtb = (RichTextBox)sender;
    rtb.SelectAll();
    rtb.SelectionFont = rtb.Font;
    rtb.SelectionColor = System.Drawing.SystemColors.WindowText;
    rtb.Select(rtb.TextLength,0);
}


0 commentaires

1
votes

La réponse de Pasztorpisti a travaillé comme un charme pour moi. Puisque j'utilise vb.net, je pensais poster mon code traduit pour d'autres: xxx


0 commentaires

0
votes

Ma solution

private void OnCommandExecuting(object sender, Telerik.Windows.Documents.RichTextBoxCommands.CommandExecutingEventArgs e)
{
    if (e.Command is PasteCommand)
    {
        //override paste when clipboard comes from out of RichTextBox (plain text)
        var documentFromClipboard = ClipboardEx.GetDocumentFromClipboard("RadDocumentGUID");
        if (documentFromClipboard == null)
        {
            (sender as RichTextBox).Insert(Clipboard.GetText());
            e.Cancel = true;
        }
    }
}


0 commentaires

0
votes

Il y a un moyen très simple de faire cela qui fonctionne bien pour moi: xxx

puisque la propriété est intrinsèquement sans formater la réinitialisation du texte RTF puis Réglage de la propriété Text sur l'entrée RAW supprime l'un des éléments spéciaux qui auraient pu être collés.


0 commentaires