IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Position curseur/caret apres remplacement de texte dans une TextBox en WPF C#


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Points : 18
    Points
    18
    Par défaut Position curseur/caret apres remplacement de texte dans une TextBox en WPF C#
    Bonjour, cela fait deux jours que je cherche une solution a mon problème ( j'ai passé énormément de temps sur google, et Stackoverflow )

    Je vous explique mon problème :

    je développe actuellement une appli en WPF C# sous visual studio 2017 (version 15.1), je suis plutot débutant en WPF, mais j'arrive a m'en sortir . J'ai cependant, déjà fait des petites applications en WindowsForms classique.

    La routine que je souhaite faire se fait en 2 étapes

    Première étape
    Je souhaite afficher le contenu d'un fichier de configuration (*.h) dans une Textbox via un invite de sélection de fichier . Cette partie est fonctionnelle , j'ai bien le texte qui s'affiche dans ma TextBox . et je peux scroller sans problème de haut en bas dans la textbox .

    Seconde étape
    Je souhaite chercher certaines valeurs a l’intérieur de la TextBox et les remplacer par d'autres . par exemple : dans mon fichier j'ai des lignes de commentaires et je souhaite au biais d'une case a cocher, commenter ou dé-commenter une ligne qui contient une chaine de caractère spécifique.


    j'ai effectué cette manipulation de cette manière MaTextBox.Text = MaTextBox.Text.Replace("//Ceci est un commentaire","Ceci n'est plus un commentaire");

    cela fonctionne aussi très bien, MAIS le curseur de ma textbox reste en haut, et la valeur qui est modifiée n'est pas visible dans la textbox, il faut scroller manuellement pour voir la modification se faire en direct .

    je souhaite faire un scroll automatique, pour aligner le curseur (caret) soit en début de ligne où le texte a été modifié, soit en fin de ligne où le texte a été modifié .

    J'ai bien activé le curseur avec un MaTextBox.focus(); ce qui initialise le curseur en début de TextBox et je compte utiliser la propriété "TextChanged" de la Textbox pour placer le curseur en fin de texte remplacé, ou utiliser l’événement de case a cocher , cochée ou decochée .

    Seulement je ne trouve pas de solutions qui fonctionne ... avez vous une idée ?

    j'ai essayé scroll to end pour tester, et le scroll a l'air de fonctionner, mais ça scrolle jusqu'en bas de la textbox ( comme son nom l'indique ScrollToEnd(); )
    je ne peux pas utiliser une methode qui consiste a compter les numéros de lignes, parce que les numéros de lignes sont succeptibles de changer .

    EDIT : J'ai oublié de préciser que j'ai bien spécifié dans mon XAML que la textbox était réglée pour du scroll vertical avec "ScrollViewer.VerticalScrollBarVisibility="Auto"

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    N'oublie pas d'utiliser sur le Winform le class static FocusManager
    Tu peux utiliser :
    - TextBlock.CaretIndex pour position le caret à la position de Démarrage et Fin
    - TextBlock.Text.IndexOf(texte recherche, position caret Démarrage);
    -si index trouvé <> -1 tu fais :
    1/ supprime texte recherche ;
    2/ insère texte de remplacement
    3/ mets focus sur TextBlock;
    4/ maj du caret ...
    code exemple XAML du Form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <Window x:Class="WpfCaret.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfCaret"
            Title="MainWindow" Height="350" Width="525" 
            FocusManager.FocusedElement="{Binding ElementName=tb}">
        <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="auto"/>
                    </Grid.RowDefinitions>
     
                    <TextBox 
                        Grid.Column="0" Grid.Row="0" FontSize="18"
                        x:Name="tb"
                        VerticalContentAlignment="Center" CaretBrush="Red"  TextWrapping="Wrap"          
                        Text="je souhaite faire un scroll automatique, pour aligner le curseur (caret) 
                        soit en début de ligne où le texte a été modifié,
                        //Ceci est un commentaire
                        soit en fin de ligne où le texte a été modifié .
                        J'ai bien activé le curseur avec un MaTextBox.focus(); ce qui initialise le curseur en début de TextBox et placer le curseur en fin de texte remplacé, ou utiliser l'événement de case a cocher , cochée ou decochée . 
                        Ceci n'est plus un commentaire
                        Seulement je ne trouve pas de solutions qui fonctionne ... " >
     
                    </TextBox> 
                    <CheckBox 
                        Grid.Column="0" Grid.Row="1" 
                        Name="commentChk"
                        Content="Comment/Uncomment" 
                        IsChecked="False" 
                        Checked="CheckBox_Checked"
                        Unchecked="commentChk_Unchecked"/>
        </Grid>
    </Window>
    code behind .cs du form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    namespace WpfCaret
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            string search = null;
            string replace = null;
            int index = -1;
            int caretPos = 0;
               private void CheckBox_Checked(object sender, RoutedEventArgs e)
            {
                search = "//Ceci est un commentaire";
                replace = "Ceci n'est plus un commentaire";
                caretPos = tb.CaretIndex;
                index = this.tb.Text.IndexOf(search, caretPos);
                if (index != -1)
                {
                    this.tb.Text = tb.Text.Remove(index, search.Length );
                    this.tb.Text =  this.tb.Text.Insert(index , replace);
                    this.tb.Focus();
                    this.tb.CaretIndex = index + replace.Length;
                }
     
            }
            private void commentChk_Unchecked(object sender, RoutedEventArgs e)
            {
                search = "Ceci n'est plus un commentaire";
                replace="//Ceci est un commentaire";
     
                caretPos = tb.CaretIndex;
                index = this.tb.Text.IndexOf(search, caretPos);
                 if (index != -1)
                {
                    this.tb.Text = tb.Text.Remove(index, search.Length );
                    this.tb.Text = this.tb.Text.Insert(index, replace);
                    this.tb.Focus();
                    this.tb.CaretIndex=index+replace.Length   ;
                }
            }
     
        }
    }
    bon code...

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/08/2015, 15h04
  2. Remplacer du texte dans une colonne
    Par Phorkys dans le forum Microsoft Office
    Réponses: 6
    Dernier message: 20/06/2014, 09h10
  3. Afficher texte dans une textbox apres un retour de page
    Par Loukas42 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/01/2011, 11h42
  4. Remplacer un texte dans une cellule Excel à partir d'un point donné
    Par tonyC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/04/2006, 19h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo