通过绑定鼠标单击导航WebBrowser

时间:2013-09-06 10:16:09

标签: c# wpf mvvm view webbrowser-control

我有一个使用MVVM模型的WPF项目。

在我的视图中,我设置了一个名为 myWebBrowser 的隐形WebBrowser,用于在网上执行操作(似乎是我动态创建WebBrowser时它没有按预期工作。)

在我的视图中,我还有一个按钮,当单击该按钮时,通常会启动在ViewModel中设置的void操作。没关系。我遇到的问题是,我想要做一些事情,例如:

myWebBrowser.Navigate(url)
myWebBrowser.LoadCompleted += WebBrowserLoaded;

并且基本上使用视图中的不可见WebBrowser启动该过程。

我怎样才能实现这一点,因为ViewModel拒绝让我使用控件名来引用它?

2 个答案:

答案 0 :(得分:1)

您可以创建Attached Property来为您执行此操作:

public static class WebBrowserProperties
{
    public static readonly DependencyProperty UrlProperty = DependencyProperty.RegisterAttached("Url", typeof(string), typeof(WebBrowserProperties), new UIPropertyMetadata(string.Empty, UrlPropertyChanged));

    public static string GetUrl(DependencyObject dependencyObject)
    {
        return (string)dependencyObject.GetValue(UrlProperty);
    }

    public static void SetUrl(DependencyObject dependencyObject, string value)
    {
        dependencyObject.SetValue(UrlProperty, value);
    }

    public static void UrlPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        WebBrowser webBrowser = dependencyObject as WebBrowser;
        if (webBrowser != null && GetUrl(webBrowser) != string.Empty)
        {
            webBrowser.Navigate(GetUrl(webBrowser));
            webBrowser.LoadCompleted += WebBrowserLoaded;
        }
    }

    public static void WebBrowserLoaded(object sender, NavigationEventArgs e)
    {
    }
}

然后您可以像这样使用它:

<WebBrowser Attached:WebBrowserProperties.Url="{Binding YourUrlProperty}" />

要更新内容,只需更改YourUrlProperty属性的值。

答案 1 :(得分:0)

谢里丹的答案很完美,但您可能需要包括 xmlns attribute

如果您使用的是namespacesxmlns:Attached="clr-namespace:foo.my.namespace"