我在这里的第一篇文章,希望有人可以提供帮助。我对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的两个实例。我可能是错的,所以请任何帮助,让这项工作表示赞赏。如果有不清楚的地方请告诉我。
亲切的问候
尼尔
答案 0 :(得分:0)
欢迎来到StackOverflow。
导航框架将导致目标页面的实例化,因此无论您喜欢与否,都将调用页面的构造函数(页面对象需要在某个时刻构建 - 对吗?)。
通常使用默认的无参数构造函数 - 所以问题是 - 如何通知目标控件某个条件已经发生?很简单,你可以添加像
这样的公共财产public bool MyCondition {get; set;}
到目标控件,并在导航框架中的事件发生并且构建目标控件/页面之后设置它。
希望有所帮助, 最好的问候。