我以前在通用Windows应用程序之前使用Caliburn.Micro进行项目。现在我将我的应用程序移植到通用窗口,并决定使用Prism Library。因为有很多uwp样本。但我太初学了,不知道如何转换我的旧视图模型。
我使用webview显示一些生成的HTML。在caliburn中,我可以使用OnViewLoaded事件在viewmodel中找到webview;
protected override void OnViewLoaded(object view)
{
base.OnViewLoaded(view);
var frameworkElement = view as FrameworkElement;
if (frameworkElement == null)
throw new ArgumentException();
var browser = frameworkElement.FindName("browser") as WebView;
if (browser == null)
throw new ArgumentException();
_webBrowser = browser;
}
但我没有发现任何可以提供此事件的事件。在棱镜中,只有OnNavigatedTo
和OnNavigatingFrom
事件。
prism有解决方法吗?
答案 0 :(得分:0)
对于迟到的回复感到抱歉,
我与Igor和Tseng合作,将打破MVVM模式。但我试图做一些复杂的事情。也许有一种方法可以用它来做MVVM,但我不想在这方面浪费太多时间。
我发现问题的解决方案如下。我写了一个VisualHelper
public class VisualHelper
{
public static T FindVisualChildInsideFrame<T>(DependencyObject depObj) where T : DependencyObject
{
var frame = FindVisualChild<Frame>(depObj);
if (frame != null && frame.Content is Page)
return FindVisualChild<T>(frame.Content as Page);
return null;
}
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null)
return childItem;
}
}
return null;
}
}
在我的viewmodel中,使用以下代码查找WebView
控件。我使用SplitView
控件就是为什么我使用FindVisualChildInsideFrame
方法。
public override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState)
{
base.OnNavigatedTo(e, viewModelState);
var browser = VisualHelper.FindVisualChildInsideFrame<WebView>(Window.Current.Content);
}