2011-03-11 3 views
0

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

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

У меня есть MainPage.xaml, который имеет элемент управления сеткой для отображения страниц. Когда мой сайт загружается, я хотел бы показать страницу 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. Я мог ошибаться, поэтому, пожалуйста, любая помощь, чтобы получить эту работу, ценится. Если есть что-то непонятное, пожалуйста, дайте мне знать.

Сердечные приветы

Neill

ответ

0

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

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

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

public bool MyCondition {get; set;} 

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

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

+0

Thanks Maciek, Посмотрите, что вы упомянули. –

+0

P.S. Можете ли вы подумать, что, возможно, еще один способ вызвать newLogonPage.LoggedInOK + = новый EventHandler (newLogonPage_LoggedInOK); newLogonPage.LoginFailed + = новый EventHandler (newLogonPage_LoginFailed); tx –

+0

Ну ... Я бы пошел на проверку подлинности на основе WCF Ria ... проверьте шаблон бизнес-приложения Silverlight. Кроме того, просмотрите галерею кода WCF Ria и образцы для образцов авторизации. – Maciek

Смежные вопросы