MVVM 中的 Webbrowser LoadCompleted 事件

Webbrowser LoadCompleted Event in MVVM

首先是我在 Page1 控件中声明的变量:

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;`
...

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

话虽如此。 网页是一种视图类型的对象,将其复制到视图模型通常被认为是应该避免的事情。也许你应该在视图中做一些处理并将结果传递给视图模型。
MVVM 并不总是意味着视图中绝对没有代码。

将依赖项 属性 添加到 window。使用附加的 属性 以便我们可以在 window 标签中的 XAML 中设置绑定。
在window

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

显然,您的 window 可能不是 mainwindow 并且我不完全确定您的文档类型是什么。这可能需要一些修改。

建造。然后你可以加入你的 window 标签:

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

在这里,someVMProperty 是您的视图模型中的 属性,它将获取文档。那必须是带有 get 和 set 的 public 属性。您将从集合中调用一些方法。 local 是对您的项目的 xmlns 引用。

您需要做的就是在您的代码中进行设置。

this.SetCurrentValue(DocProperty, newValue);

不是真正的 MVVM,但你可以通过直接在主 window 中引用来做到这一点,假设你有 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;
    }

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

public void BrowserLoadCompleted(object sender, NavigationEventArgs e)

Page1 XAML 包含浏览器:

 <WebBrowser Name="powerPointBrowser1"/>

主要window包含控件:

 <local:Page1 Name="ctlPage1"/>