我在MVVM WP7应用程序中使用WebBrowser控件。我使用附加属性来允许将控件绑定到生成的HTML字符串,如http://compiledexperience.com/blog/posts/binding-html-to-the-web-browser-control中所述。附加属性绑定到我的VM,生成HTML代码。问题是代码是在控件完全加载之前生成的,因此当VM属性发生变化时会出现异常:
在可视树中,您无法调用WebBrowser方法。
我可以使用一些“hack”,比如完全避免绑定,而是从我的VM中激活一个事件并让视图处理它,然后调用WebBrowser.NavigateToString,直到它被加载,但我想知道是否有人可以提出一个更好,更优雅的方式...
答案 0 :(得分:6)
我认为最好的办法是修复附加属性,使其正常工作。这是一个建议:
private static void OnHtmlChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var browser = d as WebBrowser;
if(browser == null)
return;
var html = e.NewValue.ToString();
try
{
browser.NavigateToString(html);
}
catch (Exception ex)
{
browser.Loaded += (s,e3) =>
{
browser.NavigateToString(html);
}
}
}
上面的代码试图显示HTML,如果抛出异常,则处理Loaded事件(在可视树中呈现控件时发生),然后提供HTML。
可能有比try / catch更好的方法,值得检查WebControl
的API。但是,上述情况应该有效。