2012-03-04 43 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

相关问题