【问题标题】:How to navigate to another page without calling the page's constructor如何在不调用页面构造函数的情况下导航到另一个页面
【发布时间】:2011-07-13 09:25:19
【问题描述】:

我在这里的第一篇文章希望有人能提供帮助。我对 C# 和 Silverlight 还很陌生,所以请保持温和。

这是我当前的问题/问题。

我有 MainPage.xaml,它有一个 Grid 控件来显示页面。当我的网站加载时,我想显示一个用于登录或注册的 UserControl 页面。

我创建了一个 UserControl 页面,我们称之为 ctrlLogon.xaml。 ctrlLogon 承载一个框架,该框架将保存登录或注册页面。我使用框架是因为我在登录和注册页面之间使用了自定义转换。

登录发生在使用 wcf 服务与数据库通信的 LoginPage.xaml 上。这很好,但是如果用户登录成功或登录失败,我需要一个事件处理程序来通知 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 事件处理程序始终为空。我认为这是因为正在创建 pgLogonPage 的两个实例。我可能是错的,所以请任何帮助来完成这项工作。如果有不清楚的地方请告诉我。

亲切的问候

尼尔

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    欢迎来到 StackOverflow。

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

    通常使用默认的无参数构造函数——所以问题是——如何通知目标控件发生了某种情况?很简单,你可以添加像

    这样的公共属性
    public bool MyCondition {get; set;}
    

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

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

    【讨论】:

    • 谢谢 Maciek,会调查你提到的内容。
    • P.S.你能想到另一种方式来调用 newLogonPage.LoggedInOK += new EventHandler(newLogonPage_LoggedInOK); newLogonPage.LoginFailed += new EventHandler(newLogonPage_LoginFailed);交易
    • 嗯...我会选择基于 WCF Ria 的身份验证...查看 Silverlight 业务应用程序模板。此外,请查看 WCF Ria 代码库和授权示例的示例。
    • 大家好,Tx 提供信息,但业务应用程序模板并没有我真正需要的东西,因为它没有使用自定义导航。无论如何,我确实设法解决了我的问题,尽管不是最优雅的解决方案。因此,对于任何对此感兴趣的人来说,我是如何做到的。在我的 LogonPage 上,一旦用户成功登录,我就会应用以下代码来访问我的主页。 MainPage rootPage = Application.Current.RootVisual 作为 MainPage;在我的 MainPage 中,我调用 ctrlLogon 的 OnLoggedIn 事件处理程序,因为这让我可以回去工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多