Копирование содержимого из WebView под WinRT

У меня есть WebView с некоторым HTML-контентом, который я хочу преобразовать в RTF. Я просмотрел существующие функции преобразования RTF, и, если честно, все они выглядят немного ненадежными. Итак, моя идея состоит в том, чтобы скопировать содержимое из WebView в RichEditBox и сохранить оттуда в RTF.

Я видел этот пример много раз.

WebBrowser1.Document.ExecCommand("SelectAll", false, null);
WebBrowser1.Document.ExecCommand("Copy", false, null);

К сожалению, элемент управления WinRT WebView не имеет свойства Document, поэтому я не могу этого сделать.

Есть ли способ вытащить содержимое из элемента управления? Чтобы было ясно, мне не нужен сам HTML — я могу получить его уже с помощью

InvokeScript("eval", new string[] { "document.getElementById('editor').innerHTML;" });

Мне нужен фактический рендеринг HTML — так же, как если бы я выбрал все в своем WebView, нажал CTRL+C, а затем вставил его в wordpad.


person roryok    schedule 21.02.2014    source источник


Ответы (1)


Это часть серии вопросов, которые я задавал, пытаясь выполнить большую задачу — преобразование HTML в RTF в приложении Windows Store.

Я рад сообщить, что вышеперечисленное можно сделать. Наконец-то я понял, как это сделать, используя DataPackage — обычно используемый для обмена контентом между приложениями.

Во-первых, эта функция javascript должна существовать в HTML-коде, загруженном в веб-просмотр.

function select_body() {
    var range = document.body.createTextRange(); 
    range.select();
}

Затем вам нужно добавить using Windows.ApplicationModel.DataTransfer; в начало документа. Недостаточно ответов StackOverflow, в которых упоминаются используемые пространства имен. Мне всегда приходится охотиться за ними.

Вот код, который творит чудеса:

// call the select_body function to select the body of our document
MyWebView.InvokeScript("select_body", null);

// capture a DataPackage object
DataPackage p = await MyWebView.CaptureSelectedContentToDataPackageAsync();

// extract the RTF content from the DataPackage
string RTF = await p.GetView().GetRtfAsync();

// SetText of the RichEditBox to our RTF string
MyRichEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, RTF);

Я потратил около 2 недель, пытаясь заставить это работать. Это такое облегчение, наконец, обнаружить, что мне не нужно вручную кодировать файл в RTF. Теперь, если я смогу заставить его работать наоборот, я буду в восторге. Не обязательно для приложения, которое я создаю, но это была бы прекрасная функция.

ОБНОВИТЬ

Оглядываясь назад, вам, вероятно, не нужно иметь функцию в HTML, вам, вероятно, это сойдет с рук (хотя я не тестировал):

MyWebView.InvokeScript("execScript", new string[] {"document.body.createTextRange().select();"})
person roryok    schedule 28.02.2014
comment
Это не работает, если изображения содержатся в HTML. Любые идеи? - person Shefali; 27.03.2014
comment
похоже, есть некоторые проблемы с изображениями в RichEditBox. См. здесь и здесь. Возможно, вы сможете сохранить его напрямую, не переходя в RichEditBox. - person roryok; 27.03.2014
comment
Привет, я очень заинтересован в вашем решении, однако я не понимаю, как внедрить javascript в html, если мне нужно решение, которое позволяет мне загружать содержимое любой веб-страницы. Я имею в виду, какова альтернатива, если функция не существует на странице, которую я хочу скопировать? - person Marc; 09.12.2015
comment
Я, наверное, ошибся, что он должен существовать. Я думаю, вы могли бы просто использовать InvokeScript для прямого запуска функции. см. обновленный ответ - person roryok; 09.12.2015
comment
Большое спасибо за ваше быстрое обновление ... однако мой код всегда дает сбой в строке InvokeScript, за исключением того, что метод или операция не реализованы. Я что-то упускаю ? - person Marc; 09.12.2015
comment
попробовать eval вместо execScript? - person roryok; 09.12.2015
comment
Я получаю то же исключение с eval.. Странная вещь.. Я пытаюсь сохранить новостные статьи, и это не удается на любой веб-странице.. - person Marc; 09.12.2015
comment
Хорошо, спасибо, у меня все заработало с помощью msdn. Я работаю над Windows 10, и есть предупреждение о том, что InvokeScript может быть изменен или недоступен для выпусков после Windows 8.1. Вместо этого используйте InvokeScriptAsync. (msdn.microsoft .com/en-us/library/windows/apps/). Он отлично работал с методом InvokeScriptAsync :) - person Marc; 09.12.2015
comment
ах да, конечно, я забыл об этом. вы использовали eval или execScript? - person roryok; 09.12.2015
comment
Привет, я пытаюсь использовать это решение для преобразования моего html в строку rtf. Когда я пытаюсь это сделать, я получаю эту ошибку Неизвестное имя. (Исключение из HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) в методе InvokeScriptAsync, что означает, что сценарий неверен. Не могли бы вы предложить мне правильный скрипт для выбора всего содержимого веб-просмотра. заранее спасибо. - person Noorul; 23.08.2017
comment
@Nooral попробуйте метод eval Марка выше, см. ссылку в его первом комментарии. - person roryok; 24.08.2017