2012-03-04 47 views
0

我在這個問題上遇到了一段時間的問題,需要幫助!我有一個父項目正在實現一個在父項目之外定義的用戶控件。名爲FullWebBrowser(一個webbrowser控件)的用戶控件被加載到我的MainPage.xaml中,該工具正常工作,但是當我試圖在父項目的其他頁面中創建此用戶控件的新實例時(這是NavigatedTo from MainPage.xaml中)。 對於快速參考我的代碼如下:在父項目無法正常工作的情況下創建用戶控件類的新實例

MainPage.xaml中

<Grid x:Name="ContentPanel" Grid.Row="0"> 
     <my:FullWebBrowser Name="TheBrowser" InitialUri="http://www.google.com" /> 
    </Grid> 

的FullWebBrowser正常工作,以及控制現在被命名爲「TheBrowser」的FullWebBrowser控制的導航和諸如此類的東西MainPage.xaml中用於MainPage.xaml.cs中。 由於某種原因,我不允許在其他導航到MainPage.xaml的頁面中調用TheBrowser,例如SharePage.xaml。爲什麼會這樣,是否有一種方法可以訪問名爲TheBrowser的FullWebBrowser以用於其他頁面?

爲了解決這個問題,我試圖在我的SharePage代碼中創建一個FullBrowserControl的新實例,並命名爲'browser'。需要注意的是,SharePage的目的是模仿默認的Windows Phone Internet Explorer共享頁面菜單項選項,以便我可以允許用戶通過電子郵件,文本或社交網絡共享當前網頁網址。

SharePage.xaml.cs

public partial class SharePage : PhoneApplicationPage 
{ 
    //new instance of FullWebBrowser 
    FullWebBrowser browser = new FullWebBrowser();   

    public SharePage() 
    { 
     InitializeComponent(); 
    } 

    private void SocialNetworks_Click(object sender, RoutedEventArgs e) 
    { 
     ShareLinkTask shareLinkTask = new ShareLinkTask(); 

     Uri shareUrl = new Uri(browser.currentUrl()); 

     shareLinkTask.Title = "Shared Link!"; 
     shareLinkTask.LinkUri = shareUrl; 
     shareLinkTask.Message = "Check out this link!"; 

     shareLinkTask.Show(); 
    } 

    private void Messaging_Click(object sender, RoutedEventArgs e) 
    { 
     SmsComposeTask smsComposeTask = new SmsComposeTask(); 

     Uri shareUrl = new Uri(browser.currentUrl()); 

     smsComposeTask.To = ""; 
     smsComposeTask.Body = "Check out this link! " + shareUrl; 

     smsComposeTask.Show(); 
    } 

    private void Email_Click(object sender, RoutedEventArgs e) 
    { 
     EmailComposeTask emailComposeTask = new EmailComposeTask(); 

     Uri shareUrl = new Uri(browser.currentUrl()); 

     emailComposeTask.Subject = "Link share from Quest internet browser"; 
     emailComposeTask.Body = "Check out this link! " + shareUrl; 
     emailComposeTask.To = ""; 
     emailComposeTask.Cc = ""; 
     emailComposeTask.Bcc = ""; 

     emailComposeTask.Show(); 
    } 
} 

似乎在SharePage.xaml.cs創造FullWebBrowser的新實例運行不正常,因爲當我把代碼從每個SharePage.xaml.cs點擊事件並將其放置在MainPage.xaml.cs中(並將FullBrowserName更改爲'TheBrowser',因爲它在MainPage.xaml中命名,而不是在SharePage.xaml.cs中命名的'browser'),因此一切正常。我是不是正確地創建了usercontrol的新實例,還是應該做其他事情來讓我正確執行SharePage操作?

回答

1

當您導航到單獨的頁面時,第一個頁面不再可用。

如果您有希望在頁面之間傳遞的詳細信息,則應該將其作爲導航過程的一部分(在查詢字符串中)。或者,您應該將它們存儲在全局可訪問的位置,例如App對象,靜態對象或已被實例化爲可用於所有必要頁面的另一對象。


因爲SharePage有瀏覽器的新實例,在實例設置的其他頁面上的屬性將無法訪問。它是這樣的:

var browserA = new WebBrowser { InitialUri = "http://stackoverflow.com/" }; 
var browserB = new WebBrowser(); 

如果再嘗試和查詢browserBInitialUri它不會從browserA值。

根據您的情況:

a)用戶對一個的MainPage web瀏覽器中瀏覽。
b)用戶點擊MainPage上的「共享」按鈕。
c)應用程序導航到SharePage選擇共享的方法
d)用戶選擇共享方法和鏈接共享。

步驟b需要做的事情是在進行導航時傳遞「currentUrl」。喜歡的東西:

MainPage.xaml.cs

NavigtionService.Navigate(new Uri("SharePage.xaml?curUrl=" 
            + HttpUtility.UrlEncode(browser.CurrentlUrl()))); 

然後在SharePage.xaml.cs

string urlToShare; 

protected override void OnNavigatedTo(....) 
{ 
    NavigationContext.QueryString.TryGetValue("curUrl", out urlToShare); 
} 

然後,您可以使用您SocialNetworks_ClickSocialNetworks_Click方法urlToShare

是的,還有其他方法可以做到這一點,但這可能是最簡單的,這是基於我對你想要做的事情的理解。

+0

@Matt_Lacey所以你說,即使在我的SharePage.xaml.cs中創建這個外部用戶控件的新實例,也不會允許我在我的SharePage.xaml.cs代碼中訪問相同的功能,就像添加外部用戶控制到我的MainPage.xaml xaml代碼?這讓我感到困惑。如果是這樣,我應該如何以及在哪裏實例化這個外部用戶控件,以便在所有頁面中都可用(即使我在MainPage.xaml中定義了該頁面以在該頁面上呈現webbrowser)?謝謝你的迴應! – Matthew 2012-03-05 22:47:44

+0

@Mthethew如果你在「SharePage」中創建它的一個新實例,那麼它將不會是同一個控件,所以試圖訪問它的屬性將是毫無意義的。讓我更新並擴展我的答案。 – 2012-03-06 00:01:13

+0

@Matt_Lacey,實現很好!我真的很感謝你用這些術語解釋創建webbrowser控件的一個新實例,而不是傳遞url和實現querystring來傳遞currentUrl()方法。謝謝! – Matthew 2012-03-06 01:02:44

相關問題