Sto cercando un modo valido e pulito per consentire la copia di testo da un richtextbox che visualizza le emoticon. Pensa a skype, dove puoi selezionare una chat e copierà le immagini emoticon e convertirle nelle loro rappresentazioni testuali (immagine di smiley in :) ecc.). Sto usando il pattern MVVM.Copia di emoticon "testo" da un richtextbox che mostra l'immagine nel wpf
5
A
risposta
4
Non conosco un modo per configurare l'analisi del contenuto RichTextBox in testo. Di seguito è riportato un modo che utilizza xml linq. Le espressioni regolari potrebbero funzionare meglio ma io le succhio. Passa al metodo ConvertToText teh FLowDocument del tuo RichTextBox.
private static string ConvertToText(FlowDocument flowDocument)
{
TextRange textRangeOriginal =
new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
string xamlString;
using (MemoryStream memoryStreamOriginal = new MemoryStream())
{
textRangeOriginal.Save(memoryStreamOriginal, DataFormats.Xaml);
xamlString = ASCIIEncoding.Default.GetString(memoryStreamOriginal.ToArray());
}
XElement root = XElement.Parse(xamlString);
IEnumerable<XElement> smilies =
from element in root.Descendants()
where (string)element.Attribute("FontFamily") == "Wingdings" && IsSmiley(element.Value)
select element;
foreach (XElement element in smilies.ToList())
{
XElement textSmiley = new XElement(element.Name.Namespace + "Span",
new XElement(element.Name.Namespace + "Run", GetTextSmiley(element.Value)));
element.ReplaceWith(textSmiley);
}
using (MemoryStream memoryStreamChanged = new MemoryStream())
{
StreamWriter streamWriter = new StreamWriter(memoryStreamChanged);
streamWriter.Write(root.ToString(SaveOptions.DisableFormatting));
streamWriter.Flush();
FlowDocument flowDocumentChanged = new FlowDocument();
TextRange textRangeChanged =
new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
textRangeChanged.Load(memoryStreamChanged, DataFormats.Xaml);
return textRangeChanged.Text;
}
}
private static string GetTextSmiley(string value)
{
switch (value)
{
case "J" :
return ":)";
case "K" :
return ":|";
case "L" :
return ":(";
default :
throw new ArgumentException();
}
}
private static bool IsSmiley(string value)
{
return value == "J" || value == "K" || value == "L";
}
+1
Ottimo lavoro! –
+0
Grazie Frank, è stato un bel problema che dovevo provare. –
Problemi correlati
- 1. Set RTF testo nel controllo WPF RichTextBox
- 2. come aggiungere emoticon per RichTextbox
- 3. Copia del testo insieme alla sua formattazione da un RichTextBox
- 4. Estratto di emoticon da un testo
- 5. caratteri speciali (emoticon) nel file di testo
- 6. Disabilita selezione richtextbox wpf
- 7. Testo da colorare in RichtextBox, C#
- 8. WPF RichTextBox Sintassi Evento di evidenziazione
- 9. Come si elimina un RichTextBox WPF?
- 10. Mostra emoticon personalizzate nella tastiera Android
- 11. Come eseguire l'override di copia e incolla in richtextbox
- 12. RichTextBox (WPF) non ha la proprietà stringa "Testo"
- 13. C# WPF Numero riga e colonna da RichTextBox
- 14. C#/WPF: Disabilita Text-Wrap di RichTextBox
- 15. Mantenere il cursore di FlowDocument centrato verticalmente nel RichTextBox
- 16. Come creare solo testo RichTextBox?
- 17. Copia da Ms Word e incolla nel problema Rich Textbox
- 18. Elementi di sola lettura Esegui elementi in un RichTextBox WPF?
- 19. Rileva se un RichTextBox è vuoto
- 20. Come ottenere RTF da RichTextBox
- 21. Change font di testo in RichTextBox
- 22. C# RichTextBox Selezionare il testo specificato
- 23. Mostra SelectedIndex nel modello di intestazione WPF TabControl
- 24. Mostra suggerimento WPF se necessario
- 25. Supporto di emoticon per area di testo o contentedabile div
- 26. Copia RDLC report testo e incolla nel blocco note
- 27. Copia da un registro all'altro
- 28. Impostazione testo WPF per TextBlock
- 29. Differenza tra Textbox e RichTextbox wpf?
- 30. Copia un elenco di file come testo da Windows Explorer
Avete considerato di iniziare una taglia su questo? –