代码之家  ›  专栏  ›  技术社区  ›  Adri1511

MVVM中的Webbrowser LoadCompleted事件

  •  0
  • Adri1511  · 技术社区  · 6 年前

    首先,我在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\u LoadCompleted方法:

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

    现在我的问题是:如何在Page1ViewModel中获得LoadCompleted方法,以便能够访问VM中的oDocument?

    编辑:

    在我的第1页。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 回复  |  直到 6 年前
        1
  •  0
  •   Andy    6 年前

    如果将依赖项属性添加到窗口中,则可以将其绑定到viewmodel中的完整属性。使用dp上的meta设置进行双向设置。 在该dp上使用setcurrentvalue将其设置为您的文档,并将其传输到viewmodel。
    viewmodel上的setter将启动,您可以在其中执行任何您想执行的操作—调用方法或其他任何操作。

    话虽如此。 网页是一种视图类型的对象,将其复制到viewmodel通常被认为是需要避免的。也许您应该在视图中进行一些处理,并将结果传递给viewmodel。
    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);
        }
    

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

    建筑然后,您可以粘贴窗口标签:

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

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

    你所需要做的就是在你的代码中设置你所拥有的。

    this.SetCurrentValue(DocProperty, newValue);
    
        2
  •  0
  •   James Harcourt    6 年前

    不是真正的MVVM,但只要在主窗口中直接引用即可,假设您有Page1(用户控件)+主窗口:

    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"/>