如何使用Prism在viewmodel中找到框架元素

时间:2016-01-05 08:43:19

标签: mvvm prism uwp

我以前在通用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;  
    }

但我没有发现任何可以提供此事件的事件。在棱镜中,只有OnNavigatedToOnNavigatingFrom事件。

prism有解决方法吗?

1 个答案:

答案 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);
}