如何在不调用页面构造函数的情况下导航到另一个页面

时间:2011-03-11 10:06:16

标签: silverlight

我在这里的第一篇文章,希望有人可以提供帮助。我对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(new 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事件处理程序始终为null。我在想这是因为正在创建pgLogonPage的两个实例。我可能是错的,所以请任何帮助,让这项工作表示赞赏。如果有不清楚的地方请告诉我。

亲切的问候

尼尔

1 个答案:

答案 0 :(得分:0)

欢迎来到StackOverflow。

导航框架将导致目标页面的实例化,因此无论您喜欢与否,都将调用页面的构造函数(页面对象需要在某个时刻构建 - 对吗?)。

通常使用默认的无参数构造函数 - 所以问题是 - 如何通知目标控件某个条件已经发生?很简单,你可以添加像

这样的公共财产
public bool MyCondition {get; set;}

到目标控件,并在导航框架中的事件发生并且构建目标控件/页面之后设置它。

希望有所帮助, 最好的问候。