создать новый экземпляр класса управления пользователем в родительском проекте не работает - PullRequest
0 голосов
/ 05 марта 2012

У меня уже давно есть проблема с этой проблемой, и мне нужна помощь! У меня есть родительский проект, который реализует пользовательский элемент управления, который определен за пределами родительского проекта. Пользовательский элемент управления с именем FullWebBrowser (веб-браузер) загружается в мой файл MainPage.xaml, который работает правильно, но проблема возникает, когда я пытаюсь создать новый экземпляр этого пользовательского элемента управления на других страницах в родительском проекте (которые NavigatedTo из MainPage.xaml). Для быстрого ознакомления мой код выглядит следующим образом:

MainPage.xaml

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

FullWebBrowser работает должным образом, а также MainPage.xaml, который управляет навигацией и еще чем-то из элемента управления FullWebBrowser, который теперь называется «TheBrowser» для использования в MainPage.xaml.cs. Теперь по какой-то причине мне не разрешено вызывать TheBrowser на других моих страницах, на которые переходят из MainPage.xaml, например SharePage.xaml. Почему это так, и есть ли способ получить доступ к FullWebBrowser с именем TheBrowser для использования на этих других страницах?

Чтобы обойти эту проблему, я попытался создать новый экземпляр FullBrowserControl в своем коде SharePage и назвал его «браузер». Отметим, что назначение SharePage состоит в том, чтобы имитировать стандартный элемент меню страницы общего доступа в Windows Phone Internet Explorer, чтобы я мог разрешить пользователям обмениваться URL-адресами текущей веб-страницы через электронную почту, текст или социальные сети.

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

Кажется, что создание нового экземпляра FullWebBrowser в SharePage.xaml.cs не работает правильно, потому что, когда я беру код из каждого события щелчка SharePage.xaml.cs и помещаю его в MainPage.xaml.cs (и изменяю от FullBrowserName до «TheBrowser», так как он назван в MainPage.xaml вместо «браузер», как указано в SharePage.xaml.cs) все работает правильно. Правильно ли я создаю новый экземпляр usercontrol или я должен делать что-то еще, что позволит мне правильно выполнять действия SharePage?

1 Ответ

1 голос
/ 06 марта 2012

Когда вы переходите на отдельную страницу, первая больше не доступна.

Если у вас есть данные, которые вы хотите передать между страницами, вы должны сделать это как часть процесса навигации (в запросестрока).В качестве альтернативы вы должны хранить их в глобально доступном месте, таком как объект App, статический объект или другой объект, который был создан таким образом, чтобы быть доступным для всех необходимых страниц.


Потому чтоSharePage имеет новый экземпляр браузера, свойства, установленные в экземпляре на другой странице, будут недоступны.Это выглядит так:

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

Если вы попытаетесь запросить InitialUri из browserB, это не будет значение из browserA.

В зависимости от вашего сценария:

a) Пользователь просматривает в веб-браузере на главной странице.
b) Пользователь нажимает кнопку «Поделиться» на главной странице.
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);
}

Затем вы можете использовать urlToShare в вашем SocialNetworks_Clickи SocialNetworks_Click методов.

Да, есть другие способы сделать это, но это, вероятно, самый простой, основанный на моем понимании того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...