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?
Tombol Keluar Untuk Aplikasi Desktop LightSwitch (Bukan Aplikasi Web)
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.
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).