Как скопировать текст в буфер обмена с частичным курсивом?

Как сделать так, чтобы txtTitleofWebpage.Text был выделен курсивом при копировании в буфер обмена, чтобы пользователь мог копировать ссылки в документ Microsoft Word? Я пытаюсь создать приложение Windows Form с помощью С# для создания Гарвардских ссылок на основе информации, которую пользователь вводит в форму.

Вот код:

Clipboard.SetText(wholeName + ", (" + yOPDate + ") " + txtTitleofWebpage.Text + 
                  " [online]. Available from: " + txtURLWeb.Text + " [Accessed: " + 
                  accessDateWeb.Value.ToShortDateString() + "].", TextDataFormat.Rtf);

person JamesFromIT    schedule 02.02.2017    source источник
comment
Ну, не так. Вам нужно использовать формат, который может задавать типографские стили и совместим с любым приложением, в которое вы хотите вставить. HTML и форматированный текст (RTF) являются обычным выбором. Google С# копирует html в буфер обмена, лучшие ответы - это все существующие вопросы SO.   -  person Hans Passant    schedule 03.02.2017
comment
@HansPassant - Итак, я могу установить для TextDataFormat значение HTML. Тем не менее, я обнаружил, что если я добавлю курсивный открывающий и закрывающий тег вокруг txtTitleofWebpages.Text, я получаю ошибки.   -  person JamesFromIT    schedule 03.02.2017
comment
добавьте @ перед открывающим и закрывающим тегами, это проигнорирует escape-символы, которые они могут воспринимать как. Нравится: @"This \n will not make a newline"   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip Итак, вот так...? Clipboard.SetText(@<body> wholeName + ", (" + yOPDate + ") " + @<i> txtTitleofWebpage.Text @</i> + " [online]. Available from: " + txtURLWeb.Text + " [Accessed: " + accessDateWeb.Value.ToShortDateString() + "]." @</body>, TextDataFormat.Html);   -  person JamesFromIT    schedule 03.02.2017
comment
@HansPassant — текст будет вставлен в документ Word.   -  person JamesFromIT    schedule 03.02.2017
comment
@EpicKip — текст будет вставлен в документ Word.   -  person JamesFromIT    schedule 03.02.2017
comment
@jamesfromit ‹body› не в кавычках, это должно быть потому, что это не текст, пока вы не поместите его в кавычки. И @ работает только перед a, чтобы избежать специальных символов из этой строки.   -  person EpicKip    schedule 03.02.2017
comment
@jamesfromit Хорошо, я легко могу вам помочь, если вы просто предоставите мне пример строки (которая не работает) вместо имен строк. Я не могу обнаружить проблему без их значения.   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip - Кажется, ничего не копируется в буфер обмена. Вот код: Clipboard.SetText(@"<body>" + wholeName + ", (" + yOPDate + ") " + @"<i>" + txtTitleofWebpage.Text + @"</i>" + " [online]. Available from: " + txtURLWeb.Text + " [Accessed: " + accessDateWeb.Value.ToShortDateString() + "]. </body>", TextDataFormat.Html);   -  person JamesFromIT    schedule 03.02.2017
comment
Хорошо, на этот раз измените переменные (txtURLWeb) на некоторые тестовые данные, чтобы я мог их использовать. Я ничего не могу сделать, если вы не предоставите мне значения. Там все идет не так, ха-ха. Даже ошибку не выдает?   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip — это то, что должно быть отформатировано как: Nightingale, J, (13/01/2017) Название веб-страницы курсивом [онлайн]. Доступно по адресу: google.co.uk [Проверено: 02.03.2017].   -  person JamesFromIT    schedule 03.02.2017
comment
@EpicKip - Нет, ошибок не выдает.   -  person JamesFromIT    schedule 03.02.2017
comment
@jamesfromit Он не копируется из-за TextDataFormat.Html, я могу вам многое сказать. Я ищу способ скопировать форматирование. Минутку :)   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip - Хорошо, спасибо. У меня полно времени, чтобы поработать над этим. :)   -  person JamesFromIT    schedule 03.02.2017
comment
@jamesfromit Сейчас начинается мой перерыв, я оставил 2 ссылки, которые могут решить вашу проблему. Я постараюсь найти ответ позже, если у меня будет время.   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip - Спасибо! :)   -  person JamesFromIT    schedule 03.02.2017
comment
@jamesfromit Отредактировал мой ответ с образцом кода и кое-чем, что можно попробовать. Если это работает, пожалуйста, дайте мне знать :)   -  person EpicKip    schedule 03.02.2017
comment
@jamesfromit Проверьте мое последнее редактирование для RTF   -  person EpicKip    schedule 03.02.2017
comment
@jamesfromit Если бы мой ответ исправил / помог вам лучше всего, могли бы вы его принять?   -  person EpicKip    schedule 03.02.2017
comment
@EpicKip - Да, я полностью принимаю это. Просто у меня еще не было времени попробовать. Колледж мешает. :)   -  person JamesFromIT    schedule 03.02.2017
comment
@jamesfromit Я могу протестировать это сегодня, так как мой рабочий день закончен, и я не буду сегодня вечером за компьютером, поэтому я надеюсь, что это сработает.   -  person EpicKip    schedule 03.02.2017


Ответы (1)


Кажется, вам нужно вставить «заголовок» в строку html, я нашел 2 примера для этого:

Это работает с Word:
Пример кода:

    Clipboard.SetText(@"Version:1.0
                        StartHTML:000125
                        EndHTML:000260
                        StartFragment:000209
                        EndFragment:000222
                        <HTML>
                        <head>
                        <title>HTML clipboard</title>
                        </head>
                        <body>
                        <!–StartFragment–><b>Hello!</b><!–EndFragment–>
                        </body>
                        </html>", 
                        TextDataFormat.Html);

Это копирует Hello! в буфер обмена, вам нужно изменить фрагменты в зависимости от размера, я думаю, поэтому я точно не знаю, как это будет работать с динамической строкой, но я надеюсь, что это поможет вам начал. 666

Если вы также можете использовать RTF

Clipboard.SetText(@"{\rtf1\ansi This is in \i\f0\fs17 italic\i0.}",
                    TextDataFormat.Rtf);

Пример со строкой

var q = "test123";
Clipboard.SetText(@"{\rtf1\ansi This is in \i\f0\fs17 " + q + @"\i0.}",
                    TextDataFormat.Rtf);

или

var q = "test123";
Clipboard.SetText( $@"{\rtf1\ansi This is in \i\f0\fs17 {q}\i0.}",
                    TextDataFormat.Rtf);

Обратите внимание на @ перед второй частью строки. Если вам нужно экранировать определенные символы (вам понадобится это с RTF), добавьте @ перед каждым открытием ".

Это кажется намного проще, потому что вам не нужно вставлять заголовок, но само форматирование немного сложнее.

person EpicKip    schedule 03.02.2017
comment
@DownVoter(s), пожалуйста, оставьте комментарий о том, почему мой ответ неверен, вместо того, чтобы просто проголосовать за него. Вопрос, на который я ссылался, точно описал, чего хочет ОП. - person EpicKip; 03.02.2017
comment
Из любопытства, как мне это сделать с RTF? - person JamesFromIT; 03.02.2017
comment
TextDataFormat.Rtf? И явно сделать форматирование в строке Rtf - person EpicKip; 03.02.2017
comment
Для этого вам может даже не понадобиться своего рода заголовок. - person EpicKip; 03.02.2017
comment
Этот RTF работает, но как заставить его работать с переменными и строками из textBox.Text? - person JamesFromIT; 03.02.2017
comment
@jamesfromit Рад, что смог помочь - person EpicKip; 04.02.2017