Tombol Keluar Untuk Aplikasi Desktop LightSwitch (Bukan Aplikasi Web)

Bagaimana cara menambahkan Tombol Keluar seperti tombol ubah kata sandi di pojok kanan atas? Jika jawabannya tidak bisa, bagaimana cara menambahkan command bar di layar?


person Aung Thiha    schedule 25.03.2015    source sumber


Jawaban (2)


Inilah cara saya melakukannya dengan cara paling sederhana yang dapat saya temukan.

Buka proyek YourProject.server Anda, klik kanan dan klik "Tambah--> Item Baru"

Pilih "Formulir Web", beri nama "SLLogOut.aspx"

Ganti apa yang ada di file aspx yang baru dibuat dengan yang berikut ini:

<%@ 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>

CATATAN: Perhatikan "Redirect". Anda mungkin perlu mengubah URL tergantung pada nama program Anda.

Di penjelajah solusi, di samping "SLLogOut.aspx", klik panah untuk meluaskannya.

Hapus "SLLogOut.aspx.designer.vb" dan hapus "SLLogOut.aspx.vb"

Buat tombol di layar pilihan Anda. Untuk kode eksekusinya, gunakan yang berikut ini:

        Dispatchers.Main.Invoke(Sub()
                                    System.Windows.Browser.HtmlPage.Window.Navigate(New Uri("../SLLogOut.aspx", UriKind.Relative))
                                End Sub)

Jika ada kemungkinan Anda akan menggunakan aplikasi ini di luar browser, Anda harus menambahkan kode can_execute untuk menonaktifkan tombol ini. Anda dapat menemukan kode itu dengan cukup mudah di tutorial lain terkait tombol logout di klien web SL. Saya hanya memberi Anda cara paling sederhana yang bisa saya temukan untuk mencapainya. Diuji di chrome dan IE.

person Stefan    schedule 31.03.2015
comment
Saya tidak dapat menggunakan solusi Anda di aplikasi desktop saya. Solusi Anda adalah untuk aplikasi HTML kalau saya tidak salah. - person Aung Thiha; 31.03.2015
comment
Ini berlaku untuk Klien Desktop Lightwitch silverlight yang dijalankan di browser. Maaf, saya tidak tahu solusi untuk jenis klien: Desktop - person Stefan; 31.03.2015
comment
Terima kasih sudah menjawab. Saya menghargai bantuan Anda :) - person Aung Thiha; 01.04.2015

Meskipun saya sudah lama tidak menangani sisi Silverlight (lebih fokus pada rute HTML 5 LightSwitch) mungkin pendekatan termudah dalam jenis klien Desktop adalah dengan menerapkan opsi keluar (yang pada dasarnya memaksa Logout secara kasar) .

Jika Anda menggunakan tombol, Anda dapat melakukannya dengan kode berikut: -

partial void Quit_Execute()
{
    Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
    {
        System.Windows.Application.Current.MainWindow.Close();
    });
}

Atau, jika Anda lebih memilih opsi menu Keluar, tambahkan layar 'place-holder' ke proyek Anda (Layar Data Baru bisa digunakan) dan tulis kode berikut di metode Jalankan di layar (terletak di DesktopClient\UserCode\ File kelas 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;
}

Pendekatan di atas juga dapat diperluas dengan menggunakan kode berikut untuk segera memuat ulang klien desktop dan secara otomatis menampilkan kembali layar login: -

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;
}

Saya menduga pendekatan di atas adalah pendekatan terdekat untuk mencapai kebutuhan Anda.

Alasan saya mengatakan ini adalah, setelah sebelumnya menyelidiki kemungkinan menampilkan kembali layar login, hal terbaik yang dapat saya capai adalah pendekatan tidak lengkap berikut: -

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;
    }
}

Sayangnya, meskipun kode di atas (diimplementasikan dalam file UserCode\Application.cs) menampilkan kembali layar login dan memungkinkan nama pengguna dan kata sandi dikosongkan melalui model tampilannya, layar tersebut tidak berfungsi dan saya tidak bisa untuk menentukan cara mengaktifkannya kembali dengan sukses.

Mungkin seseorang yang memiliki pengetahuan lebih mendalam tentang bidang ini akan berhasil menerapkan pendekatan jenis ini (jika ada yang ingin mencoba, saya dengan senang hati akan memberikan lebih banyak latar belakang mengenai mengapa layar tidak berfungsi).

person Chris Cook    schedule 25.03.2015
comment
Itu ada aplikasinya. Yang saya inginkan adalah mengeluarkan pengguna sehingga pengguna dapat masuk dengan akun pengguna lain tanpa keluar dari aplikasi. terimakasih telah menjawab. - person Aung Thiha; 26.03.2015
comment
Saya telah memperbarui jawaban saya untuk memasukkan rincian opsi lebih lanjut, yang mungkin merupakan kompromi yang dapat diterima, di samping beberapa rincian tambahan mengenai masalah yang terlibat dalam upaya mengatasi persyaratan ini - person Chris Cook; 05.04.2015
comment
@AungThiha Apakah pendekatan yang diperluas (berhenti lalu segera memuat ulang untuk menampilkan layar login) yang tercakup dalam editan saya di atas berhasil? - person Chris Cook; 02.01.2016