Not sure if this issue has been resolved, but here is a lengthy method for maintaining formatting when text is replaced:
void ReplaceTextInTextNote(TextNote txnote,
int index, //index of first character in text to be replaced
int range, //number of characters to be replaced
string addText) //text to replace the removed characters
{
FormattedText ftx = txnote.GetFormattedText();
string newText = txnote.Text;
//Collect Current UnderlineStatuses, BoldStatuses, italicstatuses, superscriptStatuses, per char in txno.Text
List<bool> underlineStatuses = new List<bool>();
List<bool> boldStatuses = new List<bool>();
List<bool> italicStatuses = new List<bool>();
List<bool> superscriptStatuses = new List<bool>();
List<bool> subscriptStatuses = new List<bool>();
for (int i = 0; i < txno.Text.Length; i++)
{
if (ftx.GetUnderlineStatus(new TextRange(i, 1)).ToString() == "All") { underlineStatuses.Add(true); }
else { underlineStatuses.Add(false); }
if (ftx.GetBoldStatus(new TextRange(i, 1)).ToString() == "All") { boldStatuses.Add(true); }
else { boldStatuses.Add(false); }
if (ftx.GetItalicStatus(new TextRange(i, 1)).ToString() == "All") { italicStatuses.Add(true); }
else { italicStatuses.Add(false); }
if (ftx.GetSuperscriptStatus(new TextRange(i, 1)).ToString() == "All") { superscriptStatuses.Add(true); }
else { superscriptStatuses.Add(false); }
if (ftx.GetSubscriptStatus(new TextRange(i, 1)).ToString() == "All") { subscriptStatuses.Add(true); }
else { subscriptStatuses.Add(false); }
}
//Remove Replaced Text
underlineStatuses.RemoveRange(index, range);
boldStatuses.RemoveRange(index, range);
italicStatuses.RemoveRange(index, range);
superscriptStatuses.RemoveRange(index, range);
subscriptStatuses.RemoveRange(index, range);
newText = newText.Remove(index, range);
//Add new Text
newText = newText.Insert(index, addText);
//Shall the inserted Text be underlined, bold
bool underlineAddText = ftx.GetUnderlineStatus(new TextRange(index, 1)).ToString() == "All";
bool boldAddText = ftx.GetBoldStatus(new TextRange(index, 1)).ToString() == "All";
bool italicAddText = ftx.GetItalicStatus(new TextRange(index, 1)).ToString() == "All";
bool superscriptAddText = ftx.GetSuperscriptStatus(new TextRange(index, 1)).ToString() == "All";
bool subscriptAddText = ftx.GetSubscriptStatus(new TextRange(index, 1)).ToString() == "All";
//Add the same formatting to a list to be added to underline,bold, italic, subscript, superscript statuses
underlineStatuses.InsertRange(index, (Enumerable.Repeat(underlineAddText, addText.Length)));
boldStatuses.InsertRange(index, (Enumerable.Repeat(boldAddText, addText.Length)));
italicStatuses.InsertRange(index, (Enumerable.Repeat(italicAddText, addText.Length)));
superscriptStatuses.InsertRange(index, (Enumerable.Repeat(superscriptAddText, addText.Length)));
subscriptStatuses.InsertRange(index, (Enumerable.Repeat(subscriptAddText, addText.Length)));
//Set New Text
txnote.Text = newText;
FormattedText ftx2 = txnote.GetFormattedText();
//Set Underline Status
for (int i = 0; i < underlineStatuses.Count; i++)
{
if (underlineStatuses[i] == true) { ftx2.SetUnderlineStatus(new TextRange(i, 1), true); }
else { { ftx2.SetUnderlineStatus(new TextRange(i, 1), false); } }
if (boldStatuses[i] == true) { ftx2.SetBoldStatus(new TextRange(i, 1), true); }
else { { ftx2.SetBoldStatus(new TextRange(i, 1), false); } }
if (italicStatuses[i] == true) { ftx2.SetItalicStatus(new TextRange(i, 1), true); }
else { { ftx2.SetItalicStatus(new TextRange(i, 1), false); } }
if (superscriptStatuses[i] == true) { ftx2.SetSuperscriptStatus(new TextRange(i, 1), true); }
else { { ftx2.SetSuperscriptStatus(new TextRange(i, 1), false); } }
if (subscriptStatuses[i] == true) { ftx2.SetSubscriptStatus(new TextRange(i, 1), true); }
else { { ftx2.SetSubscriptStatus(new TextRange(i, 1), false); } }
}
txnote.SetFormattedText(ftx2);
}