Web 浏览器在 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中获取LoadComplete方法,以便我可以访问我的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;`
...

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

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

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

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

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

建。然后你可以贴上你的窗口标签:

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

在这里,someVMProperty是视图模型中的属性,它将获取文档。这必须是具有获取和设置的公共属性。您将从集合中调用某个方法。本地是对项目的 XMLNS 引用。

您需要做的就是在现有代码中设置它。

this.SetCurrentValue(DocProperty, newValue);

不是真正的 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)

第 1 页 XAML 包含浏览器:

<WebBrowser Name="powerPointBrowser1"/>

主窗口包含控件:

<local:Page1 Name="ctlPage1"/>

最新更新