Voici l'accord: j'ai un contrôle RichTextBox et cela fonctionne bien. Le problème est qu'il existe un bouton "Insérer la datetime actuelle" qui ajoute / injecte la date de date actuelle dans la RichTextBox. L'utilisateur peut entrer dans la dateTime partout où le caret pointe. Cela implique une manipulation compliquée de chaîne et des trucs.
Des idées Comment obtenir la position actuelle du calet. Chaque fois que je reçois Richtextbox.caretpositon, il semble qu'il est dirigé vers le début de la RichTextbox et non où le carét réel est. P>
update 1: strong> p> Date Time Bouton Cliquez sur le code: P> private void DateTimeStampButton_Click(object sender, RoutedEventArgs e)
{
//TextRange tr = new TextRange(textBox.Selection.Start, textBox.Selection.End);
var tr = new TextRange(textBox.Document.ContentStart, textBox.Document.ContentEnd);
if(tr.Text.Length == 2)
{
if(tr.Text == "\r\n")
{
tr.Text = tr.Text.TrimStart(new[] { '\r', '\n' });
}
}
textBox.CaretPosition.InsertTextInRun(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ": ");
DateTimeStampButton.Focusable = false;
}
private void SharpRichTextBox_LostFocus(object sender, RoutedEventArgs e)
{
SetValue(TextProperty, Text);
var binding = BindingOperations.GetBinding(this, TextProperty);
if (binding == null) return;
if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default || binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
{
// if (TextProperty != null) BindingOperations.GetBindingExpression(this, TextProperty).UpdateSource();
}
}
public string Text
{
get
{
var newValue = new TextRange(Document.ContentStart, Document.ContentEnd).Text.RemoveNewLineAndReturn();
return newValue;
}
set
{
if (!String.IsNullOrEmpty(value))
{
SetValue(TextProperty, value.RemoveNewLineAndReturn());
Document.Blocks.Clear();
Document.Blocks.Add(new Paragraph(new Run(value)));
OnPropertyChanged("Text");
}
}
}
3 Réponses :
J'utilise ce code pour effectuer avec succès ce que vous essayez:
private void DateTimeStampButton_Click(object sender, RoutedEventArgs e) { var tr = new TextRange(textBox.Document.ContentStart, textBox.Document.ContentEnd); if (tr.Text.Length == 2) { if (tr.Text == "\r\n") { tr.Text = tr.Text.TrimStart(new[] { '\r', '\n' }); } } /* Changing the text is the only way I can get the date to insert at the beginning */ tr.Text = "I need a beer at "; textBox.CaretPosition.InsertTextInRun(DateTime.Now.ToString()); }
Impressionnant! Ça y est. J'ai juste un problème mineur. Si je tape "Hello DateTime est" et appuyez sur le bouton "Insérer DateTime". Ensuite, il apparaît comme ceci: 02/08/2010 14:27 Hello DateTime est. Comme vous pouvez voir pour une raison quelconque DateTime préfixe le texte. Si je le retire et réglez le curseur à la fin du texte DateTime Hello, puis appuyez à nouveau sur le bouton, puis cela fonctionne bien. Dans ma richtextbox i définie textbox.caretposition = document.contendend;
Dans mon application simple (WPF avec une richtextbox, une zone de texte et un bouton), il le met toujours lorsque le caret clignote. Avec un autre contrôle qui vole le caret, il insère là où le caret était dernier. Mon conseil: supprimez tout le code qui fait quoi que ce soit avec le caret et réessayez.
Merci pour la suggestion! J'ai traversé la solution complète et je n'ai trouvé aucune autre référence au caret.
Une autre chose intéressante que j'ai notée. Si je tape "bonjour", le caret est à la fin de la O comme "Bonjour |" et j'appuie sur le bouton Date, il n'entre pas à cette position. Mais si je clique sur la souris au même endroit, cela fonctionne bien. Il y a quelque chose de poisson de ce problème.
@ZAMSHARP: Sans aucun code posté, cet extrait est le meilleur conseil que je puisse donner. Sur ma forme simple, je peux taper "l'heure actuelle est la suivante:" (qui donne "l'heure actuelle est la suivante:" "avec un caret; appuyez sur le bouton lié au code ci-dessus; et obtenez" l'heure actuelle est: 2/8 / 2010 15h00:57 PM ». Vous devrez publier plus de code pour effacer toute la pêche.
Je pense que le problème réside dans l'appel SetValue dans l'événement Lost_Focus.
Ça pense que je l'ai compris. C'est parce que le bouton DateTime n'était pas défini comme focaut = Faux. Chaque fois que le bouton Date Time a été concentré, la zone de texte perd la mise au point.
J'ai essayé cette solution avec wpfoolkit.extended Richtextbox et cela n'a pas fonctionné pour moi. Cependant, j'en ai trouvé un autre et je pensais qu'il serait bon de le poster ici au cas où quelqu'un d'autre pourrait l'utiliser. P>
Mon problème était également que l'après avoir cliqué sur un bouton censé ajouter du texte à l'emplacement du caret, il l'ajoute au début de la RichTextBox. P>
La solution que j'ai trouvée est similaire à celle d'ici - p>
Richtextbox Caretposition Emplacement physique P>
Au lieu d'utiliser la caretposition, j'ai utilisé Richtextbox.selection.start.insertextinrun ("soint"). P>
Il considérait que la sélection commence comme la position du caret, même si aucune sélection n'a été faite et qu'il était donc assez bon pour moi. P>
J'espère que quelqu'un trouvera cela utile :) p>
Ceci a fonctionné pour moi: J'ai trouvé le code ici: p> Comment déplacer le caret un certain nombre de postes dans une WPF Richtextbox? p> p>
J'aimerais vraiment que je sache quoi vous dire. Selon la documentation, une caretposition de RichTextbox est censée être la position actuelle, ou le début de la RichTextBox si l'utilisateur ne l'a pas déplacée / dactylographié.
Y a-t-il un moyen d'obtenir le numéro d'index de la chaîne de richtextbox entré à partir de la carletposition. Comme si la chaîne est "hellow" et que le carret est à He | llow alors il devrait renvoyer 2.