Кнопка выхода из настольного приложения LightSwitch (не веб-приложение)

Как добавить кнопку Выход, например кнопку изменить пароль, в правом верхнем углу? Если ответ «Я не могу», как мне добавить панель команд на экран?


person Aung Thiha    schedule 25.03.2015    source источник


Ответы (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.

person Stefan    schedule 31.03.2015
comment
Я не могу использовать ваше решение в своем настольном приложении. Ваше решение предназначено для HTML-приложения, если я не ошибаюсь. - person Aung Thiha; 31.03.2015
comment
Это относится к настольному клиенту Silverlight Lightswitch, работающему в браузере. Извините, я не знаю решения для типа клиента: Рабочий стол - person Stefan; 31.03.2015
comment
В любом случае, спасибо за ответ. Я ценю вашу помощь :) - person Aung Thiha; 01.04.2015

Хотя я какое-то время не занимался 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) повторно отображает экран входа в систему и позволяет скрывать имя пользователя и пароль с помощью своей модели представления, экран не работает, и я не смог чтобы определить, как успешно повторно активировать его.

Возможно, кто-то с более глубокими знаниями в этой области сможет успешно реализовать этот тип подхода (если кто-то захочет попробовать, я с радостью предоставлю немного больше информации о том, почему экран не работает).

person Chris Cook    schedule 25.03.2015
comment
Приложение существует. Я хочу, чтобы пользователь вышел из системы, чтобы пользователь мог войти в систему с другой учетной записью пользователя, не выходя из приложения. Спасибо за ответы. - person Aung Thiha; 26.03.2015
comment
Я обновил свой ответ, включив в него подробности о другом варианте, который может быть приемлемым компромиссом, а также некоторые дополнительные сведения о проблемах, связанных с попыткой выполнить это требование. - person Chris Cook; 05.04.2015
comment
@AungThiha Помог ли расширенный подход (выйти и сразу же перезагрузить, чтобы отобразить экран входа в систему), описанный в моем редактировании выше? - person Chris Cook; 02.01.2016