Вот мое решение ... не уверен, что это "лучшие практики" ... комментарии ????
В классе App в моем приложении Silverlight у меня есть следующий код:
private Page _page = null;
private void Application_Startup(object sender, StartupEventArgs e)
{
_page = new Page();
this.RootVisual = _page;
HtmlPage.RegisterScriptableObject("App", this);
}
Также к классу приложения я добавляю [ScriptableMember] для вызова из JavaScript
[ScriptableMember]
public void ShowTeamSearch(Guid ctxId, Guid teamId)
{
_page.ShowTeamSearcher(ctxId, teamId);
}
Класс Page является классом по умолчанию, который создается в проекте Silverlight Control, на самом деле он не имеет никакого пользовательского интерфейса или логики, он просто используется для смены представлений.
Login oLogin;
TeamSearcher oSearcher;
public Page()
{
InitializeComponent();
oLogin = new Login();
oSearcher = new TeamSearcher();
oLogin.Visibility = Visibility;
this.LayoutRoot.Children.Add(oLogin);
}
Также добавлен метод для показа / скрытия представлений ... это может / вероятно станет более продвинутым / устойчивым с анимацией и т. Д. ... но это показывает основную идею:
public void ShowTeamSearcher(Guid ctxId, Guid teamId)
{
oSearcher.UserTeamId = teamId;
oSearcher.UserContextId = ctxId;
LayoutRoot.Children.Remove(oLogin);
LayoutRoot.Children.Add(oSearcher);
}
Затем, чтобы вызвать это в JavaScript после присвоения идентификатора oXaml экземпляру хоста silverlight.
var slControl = document.getElementById('oXaml');
slControl.Content.App.ShowTeamSearch(sessionId, teamId);
Кажется, это работает и не так уж и плохо с решением, но может быть что-то лучше ... мысли?