Как добавить кнопку Выход, например кнопку изменить пароль, в правом верхнем углу? Если ответ «Я не могу», как мне добавить панель команд на экран?
Кнопка выхода из настольного приложения LightSwitch (не веб-приложение)
Ответы (2)
Вот как я сделал это самым простым способом, который я мог найти.
Перейдите в свой проект YourProject.server, щелкните правой кнопкой мыши и выберите «Добавить -> Новый элемент».
Выберите «Веб-форма», назовите ее «SLLogOut.aspx».
Замените то, что находится во вновь созданном файле aspx, следующим:
<%@ Page Language="VB" %>
<script runat="server">
Protected Overrides Sub OnLoad(e As EventArgs)
FormsAuthentication.SignOut()
Session.Abandon()
' clear authentication cookie
Dim cookie1 As New HttpCookie(FormsAuthentication.FormsCookieName, "")
cookie1.Expires = DateTime.Now.AddYears(-1)
Response.Cookies.Add(cookie1)
' clear session cookie
Dim cookie2 As New HttpCookie("ASP.NET_SessionId", "")
cookie2.Expires = DateTime.Now.AddYears(-1)
Response.Cookies.Add(cookie2)
Response.Redirect("DesktopClient/default.htm")
End Sub
</script>
<!DOCTYPE HTML>
<html>
<head>
<title>Log out</title>
</head>
<body>
</body>
</html>
ПРИМЕЧАНИЕ. Обратите внимание на «Перенаправление». Возможно, вам придется изменить URL-адрес в зависимости от имени вашей программы.
В обозревателе решений рядом с «SLLogOut.aspx» щелкните стрелку, чтобы развернуть его.
Удалите как «SLLogOut.aspx.designer.vb», так и «SLLogOut.aspx.vb».
Создайте кнопку на экране по вашему выбору. Для его кода выполнения используйте следующее:
Dispatchers.Main.Invoke(Sub()
System.Windows.Browser.HtmlPage.Window.Navigate(New Uri("../SLLogOut.aspx", UriKind.Relative))
End Sub)
Если есть шанс, что вы когда-нибудь будете использовать это приложение вне браузера, вам следует добавить код can_execute, чтобы отключить эту кнопку. Вы можете легко найти этот код в других учебниках, связанных с кнопками выхода в веб-клиенте SL. Я просто даю вам самый простой способ, который я мог найти, чтобы выполнить это. Проверено как в хроме, так и в IE.
Хотя я какое-то время не занимался Silverlight (сосредоточившись больше на маршруте HTML 5 LightSwitch), вероятно, самый простой подход в типе клиента для настольных ПК — это реализовать опцию выхода (которая, по сути, грубо форсирует выход из системы) .
Если вы используете кнопку, вы должны сделать это с помощью следующего кода: -
partial void Quit_Execute()
{
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
System.Windows.Application.Current.MainWindow.Close();
});
}
Или, если вы предпочитаете пункт меню «Выход», добавьте в свой проект экран-заполнитель (подойдет экран «Новый экран данных») и напишите следующий код в методе «Выполнить» экрана (расположенном в папке DesktopClient\UserCode\ Файл класса Application.cs): -
partial void Quit_Run(ref bool handled)
{
// Set handled to 'true' to stop further processing.
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
System.Windows.Application.Current.MainWindow.Close();
});
handled = true;
}
Приведенный выше подход также можно расширить, используя следующий код для немедленной повторной загрузки настольного клиента и автоматического повторного отображения экрана входа в систему:
partial void Quit_Run(ref bool handled)
{
// Set handled to 'true' to stop further processing.
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
System.Windows.Application.Current.MainWindow.Close();
dynamic shell = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject("Shell.Application");
shell.ShellExecute(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Programs) + "\\" + System.Windows.Deployment.Current.OutOfBrowserSettings.ShortName.Split('.')[0] + ".appref-ms");
});
handled = true;
}
Я подозреваю, что вышеизложенное является наиболее близким возможным подходом к достижению ваших требований.
Причина, по которой я это говорю, заключается в том, что, предварительно изучив возможность повторного отображения экрана входа в систему, лучшее, что я смог сделать, это следующий неполный подход:
public partial class Application
{
System.Windows.Controls.Frame _rootFrame;
Microsoft.LightSwitch.Runtime.Shell.Internal.Implementation.LoginPage _loginPage;
partial void Application_Initialize()
{
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
_rootFrame = ((System.Windows.Controls.Page)((System.Windows.Controls.ContentPresenter)System.Windows.Application.Current.RootVisual).Content).Content as System.Windows.Controls.Frame;
if (_rootFrame != null)
{
_rootFrame.Navigated += new System.Windows.Navigation.NavigatedEventHandler(RootFrame_Navigated);
}
});
}
void RootFrame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
if (e.Content is Microsoft.LightSwitch.Runtime.Shell.Internal.Implementation.LoginPage)
{
_loginPage = (Microsoft.LightSwitch.Runtime.Shell.Internal.Implementation.LoginPage)e.Content;
_rootFrame.Navigated -= RootFrame_Navigated;
}
}
partial void Quit_Run(ref bool handled)
{
// Set handled to 'true' to stop further processing.
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
if (System.Runtime.InteropServices.Automation.AutomationFactory.IsAvailable == true)
{
var loginViewModel = (Microsoft.LightSwitch.Runtime.Shell.ViewModels.Implementation.Login.LoginViewModel)_loginPage.DataContext;
loginViewModel.UserName = "";
loginViewModel.Password = "";
_rootFrame.Content = _loginPage;
}
});
handled = true;
}
}
К сожалению, в то время как приведенный выше код (реализованный в файле UserCode\Application.cs) повторно отображает экран входа в систему и позволяет скрывать имя пользователя и пароль с помощью своей модели представления, экран не работает, и я не смог чтобы определить, как успешно повторно активировать его.
Возможно, кто-то с более глубокими знаниями в этой области сможет успешно реализовать этот тип подхода (если кто-то захочет попробовать, я с радостью предоставлю немного больше информации о том, почему экран не работает).