2016-09-07 1 views
0

Ich bin ein WebBrowser-Steuerelement mit einer daran befestigten Eigenschaft verwenden zu einer Uri Eigenschaft in Ansichtsmodell zu binden, wie in this question beschriebenWebBrowser in WPF mit gebundener Quelle angefügten Eigenschaft navigiert nur einmal

Es funktioniert, aber bei jedem Start der Anwendung Der Browser navigiert genau einmal. Bei zweiten und weiteren Versuchen wird es einfach leer (transparent, nicht weiß).

Ansichtsmodell:

public Uri BrowserUri 
    { 
     get 
     { 
      return GetBrowserUri();     
     } 
    } 

angebaute Eigenschaft:

public class AttachedUri 
{ 
    public static readonly DependencyProperty AttachedUriProperty = 
    DependencyProperty.RegisterAttached("AttachedUri", typeof(string), typeof(AttachedUri), new UIPropertyMetadata(null, AttachedUriPropertyChanged)); 

    public static string GetAttachedUri(DependencyObject obj) 
    { 
     return (string)obj.GetValue(AttachedUriProperty); 
    } 

    public static void SetAttachedUri(DependencyObject obj, string value) 
    { 
     obj.SetValue(AttachedUriProperty, value); 
    } 

    public static void AttachedUriPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     WebBrowser browser = o as WebBrowser; 
     if (browser != null) 
     {     
      string uri = e.NewValue as string; 
      if (!String.IsNullOrEmpty(uri)) 
      { 
       browser.NavigateToString("<html></html>"); // trying to refresh      
       browser.Navigate(new Uri(uri));      
      }     
     } 
    } 
} 

XAML:

<controls:WebBrowser at:AttachedUri.AttachedUri="{Binding BrowserUri}" Navigating="PDFBrowser_OnNavigating"/> 

Wie oben gesehen, ich habe auch versucht, wenn Navigating Ereignis ausgelöst wird jedes Mal, um zu sehen, wenn ich versuche, navigieren. Es feuert jedes Mal für Navigate aber nur einmal für NavigateToString.

Ich brauche den Browser, um zwischen verschiedenen benannten Zielen in einer PDF-Datei zu navigieren.

+0

Es gibt keine Benachrichtigungsmechanismus, der die Bindung, wenn die Änderungen BrowserUri Eigenschaft informiert. Ihre Ansichtsmodellklasse sollte die INotifyPropertyChanged-Schnittstelle implementieren. – Clemens

+0

Mein Ansichtsmodell implementiert INotifyPropertyChanged. Ich sehe jeden neuen Uri in AttachedUriPropertyChanged verarbeitet, es scheint nur keine Auswirkungen auf den Browser zu haben. Die Bindung ist als nur ein Weg gemeint, vom Ansichtsmodell zum Browser, nicht zurück – gingergenius

+0

Eine Sache, die mir aufgefallen ist: Das Aufrufen von Refresh() im Browser führt immer zu einer Exception.HRESULT E_FAIL – gingergenius

Antwort

0

Ich habe mich entschieden, jedes Mal einen neuen Browser in einem statischen Rahmen zu erstellen, wenn ich navigieren muss.

<Border Grid.Row="1" at:AttachedUri.AttachedUri="{Binding BrowserUri}"/> 

Und Code:

public static void AttachedUriPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     Border border = o as Border;    
     if (border != null) 
     {     
      string uri = e.NewValue as string; 
      if (!String.IsNullOrEmpty(uri)) 
      { 
       Uri link = new Uri(uri); 
       WebBrowser newBrowser = new WebBrowser(); 
       newBrowser.Navigate(link); 
       border.Child = newBrowser; 
      }     
     } 
    } 
Verwandte Themen