2

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

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

我的视图中还有一个按钮,单击该按钮通常会启动在 ViewModel 中设置的无效操作。没关系。我遇到的问题是我希望那个 void 做一些事件,例如:

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

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

由于 ViewModel 拒绝我使用控件名称来引用它,我该如何实现这一点?

4

3 回答 3

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属性的值。

于 2013-09-06T10:40:48.850 回答
0

如果您的网络浏览器是 xaml 中的隐藏元素,请尝试使用 EventToCommand。

于 2013-09-06T10:21:17.143 回答
0

Sheridan 的答案是完美的,但您可能需要包括xmlns attribute

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

于 2019-01-31T06:55:49.640 回答