Как перейти на другую страницу без вызова конструктора страницы - PullRequest
0 голосов
/ 11 марта 2011

Мой первый пост здесь, надеюсь, кто-нибудь может помочь.Я довольно новичок в C # и Silverlight, поэтому, пожалуйста, будьте осторожны.

Вот моя текущая проблема / проблема.

У меня есть MainPage.xaml, который имеет элемент управления Grid для отображения страниц.Когда мой сайт загружается, я хотел бы показать страницу UserControl для входа или регистрации.

Я создал страницу UserControl, давайте назовем ее ctrlLogon.xaml.ctrlLogon содержит фрейм, который будет содержать страницу входа или регистрации.Я использую фрейм, потому что я использую пользовательский переход между страницей входа и регистрации.

Вход в систему происходит в LoginPage.xaml, который использует службы wcf для связи с базой данных.Это нормально, но мне нужен обработчик событий для уведомления ctrlLogon, если пользователь успешно вошел в систему или не может войти в систему.

В ctrlLogon.xaml.cs:

public partial class ctrlLogon : UserControl
{
    pgLogonPage newLogonPage;

    public ctrlLogon()
    {
        InitializeComponent();
        newLogonPage = new pgLogonPage();
        newLogonPage.LoggedInOK += new EventHandler(newLogonPage_LoggedInOK);
        newLogonPage.LoginFailed += new EventHandler(newLogonPage_LoginFailed);
    }

    void newLogonPage_LoggedInOK(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
    }

    void newLogonPage_LoginFailed(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
    }

Затем либо черезщелчок по кнопке или любое другое означающее, что я использую:

ContentFrame.Navigate (новый Uri ("/ Views / pgLogonPage.xaml"), UriKind.Relative);

Это прекрасно работает, перейдя к pgLogonPage.

Моя проблема заключается в том, что я создаю и экземпляр pgLogonPage для настройки обработчика событий, но Navigate также создает экземпляр pgLogonPage, поэтому следующее не работает:

public partial class pgLogonPage : Page
{
    ServiceClient smsClient;

    public pgLogonPage()
    {
        InitializeComponent();

        Client = new ServiceClient();
        Client.LoginCompleted += new EventHandler<LoginCompletedEventArgs (Client_LoginCompleted);
    }

public event EventHandler LoggedInOK;

    public void OnLoggedInOK()
    {
        if (LoggedInOK != null)
            LoggedInOK(this, new EventArgs());
    }

    public event EventHandler LoginFailed;
    public void OnLoginFailed()
    {
        if (LoginFailed != null)
            LoginFailed(this, new EventArgs());
    }


    void Client_LoginCompleted(object sender, LoginCompletedEventArgs e)
    {
        if (e.Result.Contains("Success"))
        {
            OnLoggedInOK();                            
        }

        else
        {
            OnLoginFailed();
        }
    }

}

Обработчики событий LoggedInOK и LoginFailed всегда равны нулю.Я думаю, это потому, что создаются два экземпляра pgLogonPage.Я могу ошибаться, поэтому, пожалуйста, любая помощь, чтобы получить эту работу приветствуется.Если что-то не ясно, пожалуйста, дайте мне знать.

С уважением

Нил

1 Ответ

0 голосов
/ 11 марта 2011

и добро пожаловать в StackOverflow.

Инфраструктура навигации вызовет создание экземпляра целевой страницы, поэтому будет вызван конструктор страницы, нравится вам это или нет (объект страницы должен быть создан в какой-то момент, верно?).

Обычно используется конструктор по умолчанию без параметров, поэтому возникает вопрос - как уведомить целевой элемент управления о том, что произошло определенное условие? Просто, вы можете добавить публичную собственность как

public bool MyCondition {get; set;}

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

Надеюсь, это немного поможет, С наилучшими пожеланиями.

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