Изменить AttachedProperty веб-браузера при навигации - PullRequest
0 голосов
/ 07 февраля 2011

Я использовал те статьи для создания AttachedProperty элемента управления Webbrowser, чтобы я мог связать «BindableSource» со своим публичным свойством «Path». Это здорово и хорошо работает с одним небольшим недостатком. В моем конструкторе ViewModel свойство установлено на:

Path = new Uri("http://microsoft.com");

Когда страница загружается, я перехожу на другую ссылку, и свойство «WebBrowser.Source» изменяется, но «WebBrowser.BindableSource» не изменяется. Когда я нажимаю кнопку, которая устанавливается снова:

 Path = new Uri("http://microsoft.com");

«BindableSourcePropertyChanged» не вызывается, поскольку свойство имеет эти значения.

У меня была идея, как решить эту проблему, но это нехорошо, потому что замедляет производительность. Это значит установить Path на другой URL и после этого установить его на реальный URL (http://microsoft.com).

   Path = new Uri("http://google.com");
   Path = new Uri("http://microsoft.com");

Не могли бы вы дать мне лучшую идею, как я могу ее решить. Спасибо заранее.

1 Ответ

2 голосов
/ 07 февраля 2011

Предлагаю синхронизировать BindableSource с событием Navigated. Вы можете достичь этого, выставив еще одно присоединенное поведение в вашем классе WebBrowserUtility, которое реагирует на событие Navigated следующим образом:

    public static readonly DependencyProperty ShouldHandleNavigatedProperty =
        DependencyProperty.RegisterAttached(
            "ShouldHandleNavigated", 
            typeof(Boolean), 
            typeof(WebBrowserUtility), 
            new UIPropertyMetadata(false, ShouldHandleNavigatedPropertyChanged));

    public static Boolean GetShouldHandleNavigated(DependencyObject obj)
    {
        return (Boolean)obj.GetValue(BindableSourceProperty);
    }

    public static void SetShouldHandleNavigated(DependencyObject obj, Boolean value)
    {
        obj.SetValue(ShouldHandleNavigatedProperty, value);
    }

    public static void ShouldHandleNavigatedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        WebBrowser browser = o as WebBrowser;
        if (browser != null)
        {
            if ((bool)e.NewValue)
            {
                browser.Navigated += new NavigatedEventHandler(Browser_Navigated);
            }
            else
            {
                browser.Navigated -= new NavigatedEventHandler(Browser_Navigated);
            }
        }
    }

    private static void Browser_Navigated(object sender, NavigationEventArgs e)
    {
        WebBrowser browser = sender as WebBrowser;
        if (browser != null)
        {
            browser.SetValue(WebBrowserUtility.BindableSourceProperty, browser.Source.AbsoluteUri);
        }
    }

Использование в xaml:

<WebBrowser self:WebBrowserUtility.BindableSource="{Binding WebAddress}"
            self:WebBrowserUtility.ShouldHandleNavigated="True"/>  

P.S. Я должен признать, что эта реализация довольно грязная, потому что установка BindableSource внутри обработчика событий Navigated вызывает один дополнительный запуск события. Но этот код работает, и вы можете подумать о его улучшении.

EDITED

    public static class WebBrowserUtility
    {
        ...
        private const string _SkipSourceChange = "Skip";

        public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            WebBrowser browser = o as WebBrowser;
            if (browser != null)
            {
                string uri = e.NewValue as string;
                if (!_SkipSourceChange.Equals(browser.Tag))
                {
                    browser.Source = uri != null ? new Uri(uri) : null;
                }
            }
        }

        private static void Browser_Navigated(object sender, NavigationEventArgs e)
        {
            WebBrowser browser = sender as WebBrowser;
            if (browser != null)
            {
                if (WebBrowserUtility.GetBindableSource(browser) != e.Uri.ToString())
                {
                        browser.Tag = _SkipSourceChange;
                        browser.SetValue(WebBrowserUtility.BindableSourceProperty, browser.Source.AbsoluteUri);
                        browser.Tag = null;
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...