MVVM中的Webbrowser LoadCompleted事件

时间:2018-04-12 10:07:58

标签: c# wpf mvvm webbrowser-control

首先我在Page1 Control中声明了变量:

private PPt.Presentation oPPPresentation = null;
    private PPt.Application oPPApplication = null;
    private PPt.SlideShowWindow oPPslideShow;
    private PPt.Slide oPPSlide;
    private Object oDocument;

我目前有一个webBrowser控件(名为powerPointBrowser1),它显示一个字符串传递的powerpoint:

public Page1()
    {
        InitializeComponent();
        powerPointBrowser1.Navigate(strFileName);
        powerPointBrowser1.LoadCompleted += powerPointBrowser1_LoadCompleted;
    }

这是我的powerPoint1Browser_LoadCompleted方法:

private void powerPointBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
    {
        oDocument = powerPointBrowser1.Document;
        oPPPresentation = (PPt.Presentation)oDocument;
        oPPApplication = oPPPresentation.Application;
    }

现在我的问题:如何在我的Page1ViewModel中获取LoadCompleted方法,以便我可以访问我的VM中的oDocument?

编辑:

在我的Page1.xaml.cs中:

 public static DependencyProperty DocProperty =
    DependencyProperty.RegisterAttached("Doc"
        , typeof(Object)
        , typeof(Page1)
        , new FrameworkPropertyMetadata(null)
        { BindsTwoWayByDefault = true });
    public static Object GetDoc(DependencyObject obj)
    {
        return (Object)obj.GetValue(DocProperty);
    }
    public static void SetDoc(DependencyObject obj, Object value)
    {
        obj.SetValue(DocProperty, value);

private void powerPointBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
    {
        oDocument = powerPointBrowser1.Document;
        this.SetCurrentValue(DocProperty, oDocument); //new
        oPPPresentation = (PPt.Presentation)oDocument;
        oPPApplication = oPPPresentation.Application;
    }

视图模型:

    public Object someVMProperty { get; set; }`
private string GetSlideNumber()

    {
        oPPPresentation = (PPt.Presentation)someVMProperty;`
...

2 个答案:

答案 0 :(得分:0)

如果向窗口添加依赖项属性,则可以将其绑定到viewmodel中的完整属性。使用dp上的元设置进行双向播放。 在该dp上使用setcurrentvalue将其设置为您的文档,它将传输到viewmodel 视图模型上的setter将会触发,你可以在那里做任何你想做的事情 - 调用方法或其他任何东西。

说完了。 网页是一种视图类型的对象,将其复制到视图模型通常被认为是要避免的。也许您应该在视图中进行一些处理并将结果传递给viewmodel MVVM并不总是意味着视图中没有代码。

向窗口添加依赖项属性。使用附加属性,以便我们可以在窗口标记中的XAML中设置绑定 在窗口中

pip install mysqlclient

显然,您的窗口可能不是主窗口,我不完全确定您的文档类型。这可能需要一些修改。

构建。然后你可以坚持使用你的窗口标签:

    public static DependencyProperty DocProperty =
        DependencyProperty.RegisterAttached("Doc"
            , typeof(HTMLDocument)
            , typeof(MainWindow)
            , new FrameworkPropertyMetadata(null)
        { BindsTwoWayByDefault = true });
    public static HTMLDocument GetDoc(DependencyObject obj)
    {
        return (HTMLDocument)obj.GetValue(DocProperty);
    }
    public static void SetDoc(DependencyObject obj, HTMLDocument value)
    {
        obj.SetValue(DocProperty, value);
    }

这里,someVMProperty是viewmodel中将获取文档的属性。那必须是带有get和set的公共属性。你将从集合中调用一些方法。 local是对项目的xmlns引用。

您需要做的只是在您的代码中设置它。

 local:MainWindow.Doc="{Binding someVMProperty}"

答案 1 :(得分:0)

不是真正的MVVM,但你可以直接在主窗口中引用它,假设你有Page1(用户控件)+ MainWindow:

public partial class Page1 : UserControl
{
    public Page1()
    {
        InitializeComponent();
        powerPointBrowser1.Navigate("http://www.bbc.co.uk");
    }
}

public partial class MainWindow : Window
{
    private Page1Model _pageModel;

    public MainWindow()
    {
        InitializeComponent();

        _pageModel = new Page1Model();
        DataContext = _pageModel;

        ctlPage1.powerPointBrowser1.LoadCompleted += _pageModel.BrowserLoadCompleted;
    }

然后您可以在视图模型类中处理该事件:

public void BrowserLoadCompleted(object sender, NavigationEventArgs e)

Page1 XAML包含浏览器:

 <WebBrowser Name="powerPointBrowser1"/>

主窗口包含控件:

 <local:Page1 Name="ctlPage1"/>