2011-02-07 12 views
0

thoseの記事を使用してWebBrowserコントロールのAttachedPropertyを作成しました。したがって、 "BindableSource"をパブリックプロパティ "Path"にバインドできます。 1つの小さな欠点でうまくいきます。ページは、私は別のリンクに移動し、「WebBrowser.Source」プロパティが変更されたが、「WebBrowser.BindableSourceは」に変更されていないロードされると移動時のWebBrowserのAttachedPropertyの変更

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

: は私のViewModelコンストラクタでプロパティがに設定されています。プロパティは、これらの値を持っているので、「BindableSourcePropertyChangedが」と呼ばれていません

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

:私はもう一度設定ボタンをクリックしてください 。

私はそれを解決するためのアイディアを持っていましたが、パフォーマンスが低下するため、パスを別のURLに設定してから実際のURL(http://microsoft.com)に設定します。

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

あなたは私にそれを解決する方法を教えてください。 ありがとうございました。

答えて

2

BindableSourceとNavigatedイベントを同期させることを提案します。 XAMLで

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

使用法:

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

P.S. あなたは次のようにナビゲートイベントに反応するあなたのWebBrowserUtilityクラスで動作付属の別のものを、露光することにより、これを達成coukld Navigatedイベントハンドラ内でBindableSourceを設定すると、1つの追加イベントが強制的に発生するため、この実装はかなり汚いことを認めてください。しかし、このコードは機能し、その改善について検討することができます。

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; 
       } 
      } 
     } 
    } 
+0

おかげメイト、あなたのソリューションは、エラーフリーで動作しますが、いくつかのページに、私はPOSTリクエストを使用しているので、私の問題を解決することはできません。 同じページに2回移動しているので、ナビゲートするとBindableSourceProppertyが変更され、Webブラウザは同じページに移動します。投稿リクエストを使用した場合は、問題が発生します。 しかし、場合によっては役立つことがあります。 – Tiho

+0

実際、私はこの問題をP.S.に認めました。私はちょうど想像力をオンにし、この問題をyourelfで解決するように提案しました。ソリューションは明らかです:browser.SetValue(...)の前にBrowser_Navigatedハンドラの内部で、browser.SetValue(...)の後にフラグを設定して、即座にリセットする必要があります。次に、BindableSourcePropertyChangedハンドラでこのフラグが設定されている場合は、BindableSourcePropertyの変更をスキップする必要があります。適切な方法は、別の1つの添付プロパティを公開することですが、上記のサンプルでは、​​Tagプロパティを使用して予期した結果が得られます。 –

+0

ありがとうございます。このソリューションは今日私を助けました。 –

関連する問題