Полный текст не отображается в веб-браузере Windows Phone
Я пытаюсь отобразить html-контент, доступный в локальном xml-файле. Я использую приведенный ниже код для отображения контента в веб-браузере,
StringBuilder sb = new StringBuilder();
sb.Append(@"<html><head>");
sb.Append(@"<meta name=""viewport"" content=""width=""device-width"">");
sb.Append(@"<style type=""text/css"">");
sb.Append(@"body {");
sb.Append(@" margin:5px;");
sb.Append(@" text-align:center;");
sb.Append(@" letter-spacing:0.1em;");
sb.Append(@" font-size-adjust: none;");
sb.Append(@" font-size: 14px;");
sb.Append(@" font-family:""Segoe WP"";");
sb.Append(@" }");
sb.Append("p");
sb.Append("{margin:5px;}");
sb.Append(@"</style></head><body>");
sb.Append(commentry);
sb.Append(@"</body></html>");
discusswebBrowser.NavigateToString(sb.ToString());
Содержимое отображается в веб-браузере, но последние несколько строк обрезаются / не отображаются. Я попытался изменить параметры, высоту элемента управления и т. Д., Но некоторые конечные строки не отображаются, независимо от длины содержимого. Я даже пытался поместить в веб-браузер только простой текст. Причина, по которой я использую управление через веб-браузер, заключается в том, что контент форматируется для html-страницы, а также для обеспечения функции масштабирования. Контроль определяется следующим образом:
<Grid x:Name="ContentPanel" Grid.Row="1" >
<ScrollViewer Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<phone:WebBrowser Name="discusswebBrowser" Height="1000" />
</ScrollViewer>
</Grid>
2 ответа
Не смог найти ответа на эту проблему, поэтому придумал обходной путь самостоятельно. Сначала я проверяю длину отображаемого содержимого, а затем, если длина превышает 4000 символов, я делю его на две части. Затем также добавьте панель приложения с кнопкой "Дополнительно", чтобы пользователь мог нажать на кнопку и просмотреть оставшийся текст. Вот код
{
if (commentry.Length > 4000 && commentry.IndexOf("<p>", commentry.Length / 2) > 0)
{
//Change the xaml to contain a panaroma , and if then on the second item create web browser control with the second half of the commentry.
commentry1 = commentry.Remove(commentry.IndexOf("<p>", commentry.Length / 2), commentry.Length - commentry.IndexOf("<p>", commentry.Length / 2));
commentry2 = commentry.Remove(0, commentry.IndexOf("<p>", commentry.Length / 2));
appBarMoreButton = new ApplicationBarIconButton(new Uri("/Images/quote.back.png", UriKind.Relative));
appBarMoreButton.Text = "more";
appBarMoreButton.Click += new EventHandler(loadMoreContent);
appBarPreviousButton = new ApplicationBarIconButton(new Uri("/Images/quote.back.png", UriKind.Relative));
appBarPreviousButton.Text = "Previous";
appBarPreviousButton.Click += new EventHandler(loadFirstPart);
}
var htmlScript = "<script>function getDocHeight() { " +
"return document.getElementById('pageWrapper').offsetHeight;" +
"}" +
"function SendDataToPhoneApp() {" +
"window.external.Notify('' + getDocHeight());" +
"}</script>";
if (commentry1 == null && commentry2 == null)
{
var htmlConcat = string.Format("<html><meta name=\"viewport\" content=\"width=device-width,user-scalable=yes,height=device-height\" /><head>{0}</head>" +
"<body style=\"margin:5px;padding:0px;background-color:{3};\" " +
"onLoad=\"SendDataToPhoneApp()\">" +
"<div id=\"pageWrapper\" style=\"width:100%;color:{2}; background-color:{3}\"> " +
"{1}</div></body><footer></footer></html>",
htmlScript,
commentry, fontColor, backGroundColor);
discusswebBrowser.NavigateToString(htmlConcat);
}
else
{
var htmlConcat = string.Format("<html><meta name=\"viewport\" content=\"width=device-width,user-scalable=yes,height=device-height\" /><head>{0}</head>" +
"<body style=\"margin:5px;padding:0px;background-color:{3};\" " +
"onLoad=\"SendDataToPhoneApp()\">" +
"<div id=\"pageWrapper\" style=\"width:100%;color:{2}; background-color:{3}\"> " +
"{1}</div></body><footer></footer></html>",
htmlScript,
commentry1, fontColor, backGroundColor);
discusswebBrowser.NavigateToString(htmlConcat);
ApplicationBar = new ApplicationBar();
ApplicationBar.IsVisible = true;
ApplicationBar.Mode = ApplicationBarMode.Minimized;
ApplicationBar.IsMenuEnabled = false;
ApplicationBar.Buttons.Add(appBarMoreButton);
}
discusswebBrowser.ScriptNotify +=
new EventHandler<NotifyEventArgs>(wb1_ScriptNotify);
}
Для обработчика событий для кнопки more создайте функцию, которая будет загружать оставшийся текст вместе с кнопкой на панели приложения, чтобы вернуться к первой части.
private void loadMoreContent(object sender, EventArgs e)
{
if (commentry2 != null)
{
var htmlScript = "<script>function getDocHeight() { " +
"return document.getElementById('pageWrapper').offsetHeight;" +
"}" +
"function SendDataToPhoneApp() {" +
"window.external.Notify('' + getDocHeight());" +
"}</script>";
var htmlConcat = string.Format("<html><meta name=\"viewport\" content=\"width=device-width,user-scalable=yes,height=device-height\" /><head>{0}</head>" +
"<body style=\"margin:5px;padding:0px;background-color:{3};\" " +
"onLoad=\"SendDataToPhoneApp()\">" +
"<div id=\"pageWrapper\" style=\"width:100%;color:{2}; background-color:{3}\"> " +
"{1}</div></body><footer></footer></html>",
htmlScript,
commentry2, fontColor, backGroundColor);
discusswebBrowser.NavigateToString(htmlConcat);
this.ApplicationBar.Buttons.RemoveAt(0);
this.ApplicationBar.Buttons.Add(appBarPreviousButton);
}
}
Вы должны удалить жестко закодированный Height="1000"
Также Grid.Row="1" в ScrollViewer
не требуется, так как вы не определили определения строк для ContentPanel
<Grid x:Name="ContentPanel" Grid.Row="1" >
<ScrollViewer VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<phone:WebBrowser Name="discusswebBrowser" />
</ScrollViewer>
</Grid>
Также вам не нужен ScrollViewer как телефон:WebBrowser имеет механизм прокрутки внутри.
Последний фрагмент, который должен работать
<Grid x:Name="ContentPanel" Grid.Row="1" >
<phone:WebBrowser Name="discusswebBrowser" />
</Grid>