искал подобную тему, но кроме ссылок на мсдн ничего не нашел)
мсдн только внес путанницы)
итак
в WinForms есть такая удобная штука, как RichTextBox
в свое время писал программу, сегодня хочу переделать ее под WPF
программа выделяла куски текста по 2 параметрам: стартовыя позиция символа и длина
выполнялись следющие действия
1. при выделении мышкой запоминались координаты (start, length) и складывались в файл, текст выделялся цветом
Здравствуйте, gnan, Вы писали:
G>В WPF RichTextBox как я могу сделать подобное?
Используй RichTextBox.Selection. У него есть Start, End и Select. Если этого мало, то напиши, плиз, в чем конкретно затык.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, gnan, Вы писали:
G>>В WPF RichTextBox как я могу сделать подобное? MK>Используй RichTextBox.Selection. У него есть Start, End и Select. Если этого мало, то напиши, плиз, в чем конкретно затык.
затык видимо в TextPointer и как его хранить в файле подобно значениям start, length?
Здравствуйте, gnan, Вы писали:
G>затык видимо в TextPointer и как его хранить в файле подобно значениям start, length?
Набросал такой примерчик (rt — это RichTextBox):
FlowDocument myFlowDoc = new FlowDocument();
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 1")));
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 2")));
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 3")));
rt.Document = myFlowDoc;
rt.Selection.Select(
rt.Document.ContentStart.GetPositionAtOffset(3),
rt.Document.ContentStart.GetPositionAtOffset(10));
// Сохранили начало выделения и конецvar start = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.Start);
var end = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.End);
// Загрузили начало выделения и конец
rt.Selection.Select(
rt.Document.ContentStart.GetPositionAtOffset(start),
rt.Document.ContentStart.GetPositionAtOffset(end));
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, gnan, Вы писали:
G>>затык видимо в TextPointer и как его хранить в файле подобно значениям start, length? MK>Набросал такой примерчик (rt — это RichTextBox): MK>
MK>FlowDocument myFlowDoc = new FlowDocument();
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 1")));
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 2")));
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 3")));
MK>rt.Document = myFlowDoc;
MK>rt.Selection.Select(
MK> rt.Document.ContentStart.GetPositionAtOffset(3),
MK> rt.Document.ContentStart.GetPositionAtOffset(10));
MK>// Сохранили начало выделения и конец
MK>var start = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.Start);
MK>var end = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.End);
MK>// Загрузили начало выделения и конец
MK>rt.Selection.Select(
MK> rt.Document.ContentStart.GetPositionAtOffset(start),
MK> rt.Document.ContentStart.GetPositionAtOffset(end));
MK>
Там засады покруче на самом деле. Я этим вопросом интересовался, пришел к выводу, что лучше какой-нить AvalonEdit использовать.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, gnan, Вы писали:
G>>затык видимо в TextPointer и как его хранить в файле подобно значениям start, length? MK>Набросал такой примерчик (rt — это RichTextBox): MK>
MK>FlowDocument myFlowDoc = new FlowDocument();
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 1")));
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 2")));
MK>myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 3")));
MK>rt.Document = myFlowDoc;
MK>rt.Selection.Select(
MK> rt.Document.ContentStart.GetPositionAtOffset(3),
MK> rt.Document.ContentStart.GetPositionAtOffset(10));
MK>// Сохранили начало выделения и конец
MK>var start = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.Start);
MK>var end = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.End);
MK>// Загрузили начало выделения и конец
MK>rt.Selection.Select(
MK> rt.Document.ContentStart.GetPositionAtOffset(start),
MK> rt.Document.ContentStart.GetPositionAtOffset(end));
MK>
трабл номер 2 возник
как содержимое rtb сохранять в файл в виде текста
в винформз был rtb.Text
тут есть какие нибудь возможности??
и вопрос еще один
каком образом можно реализовать всплывающие контекстные подсказки?
например наводишь на слово, в подсказке отображается это же слово.
Здравствуйте, gnan, Вы писали:
G>трабл номер 2 возник G>как содержимое rtb сохранять в файл в виде текста G>в винформз был rtb.Text G>тут есть какие нибудь возможности??
G>и вопрос еще один G>каком образом можно реализовать всплывающие контекстные подсказки? G>например наводишь на слово, в подсказке отображается это же слово.
ваще обленился
сохранение:
TextRange txtr;
FileStream fs;
txtr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
fs = new FileStream("myFile.txt", FileMode.OpenOrCreate);
txtr.Save(fs, DataFormats.Text);
fs.Close();
чтение:
TextRange txtr;
FileStream fs;
if (File.Exists("myFile.txt"))
{
txtr = new TextRange(rtb2.Document.ContentStart, rtb2.Document.ContentEnd);
fs = new FileStream("myFile.txt", FileMode.OpenOrCreate);
txtr.Load(fs, DataFormats.Text);
fs.Close();
}
если будут варианты еще, милости просим))
З.Ы. Вопрос G>каком образом можно реализовать всплывающие контекстные подсказки? G>например наводишь на слово, в подсказке отображается это же слово.
остается открытым
Здравствуйте, gnan, Вы писали:
G>З.Ы. Вопрос G>G>каком образом можно реализовать всплывающие контекстные подсказки? G>>например наводишь на слово, в подсказке отображается это же слово. G>остается открытым
Внутри RichTextBox сплошь FrameworkContentElement'ы, у которых есть свойство ToolTip. Посмотри этот пример.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, gnan, Вы писали:
G>>затык видимо в TextPointer и как его хранить в файле подобно значениям start, length? MK>Набросал такой примерчик (rt — это RichTextBox):
Span span = new Span(rt.Selection.Start, rt.Selection.End);
span.Foreground = Brushes.Green;
добросал вот до такого
как я понимаю при этом в текст добавляются какие то теги, которые выделяют текст, т.к. после выделения того же текста позиции start и end
второй раз выводятся позиции большие, чем были до этого
var start = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.Start);
var end = rt.Document.ContentStart.GetOffsetToPosition(rt.Selection.End);
MessageBox.Show(rt.Selection.Text + "[" + start.ToString() + ", " + end.ToString() + "]");
а можно ли парсить текст по таким вот свойствам, как цвет?
т.е. найти в тексте rtb все слова, выделенные Brushes.Green
таким образом не придется пересчитывать сохраненные значения start и end при повторном выделении