C# properties settings works from the second time on - winforms

Here's the problem: I've published an app made with Windows Forms with ClickOnce. Therefore, I can't show Terms of Service before install. The client decided to show some Terms of Service page after the install, and if the user agreed with the terms by pressing the button, show the main app. Problem is, after install the app shows the ToS, the user accepts, and after the first restart the user is shown the ToS again! If he accepts, the next time the user opens the app (either after a restart or after the app is closed and opened again) this problem will no longer appear, i.e. if the user agreed to the ToS the main app will show up, without asking the ToS.
The code defining the tos in settings:
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool tos {
get {
return ((bool)(this["tos"]));
}
set {
this["tos"] = value;
}
}
The code that checks for ToS when the app starts:
bool tosB = Properties.Settings.Default.tos;
if (!tosB)
{
this.tab_control.SelectTab(this.TOS_PAGE);
this.richTextBox1.Rtf =
global::MyAppName.Properties.Resources.terms_and_conditions;
}
else
{
check_connectivity();
}
The code that runs when the user cliks the I agree button:
private void button2_Click(object sender, EventArgs e)
{
Properties.Settings.Default.tos = true;
Properties.Settings.Default.Save();
Microsoft.Win32.RegistryKey key =
Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.SetValue("My App Name", Application.ExecutablePath.ToString());
check_connectivity();
}

Related

Silverlight windows phone 8.1 FileOpenPicker for all files Continue not working

i create silverlight windows phone 8.1 project and i need to choose all kind of file from windows phone
i used FileOpenPicker for choose the file it redirect correctly and i can choose the file this is my code
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.List;
openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
openPicker.FileTypeFilter.Add("*");
openPicker.PickMultipleFilesAndContinue();
And i follow this msdn for receiving select
In my case
if i selecting file and come back to the app its every thing working
if i without select any file and come back using mobile hardware back button my app come to home screen. but it need to stay file picker page
my first page
when i press mobile hardware back button in above screen the page redirect to my first page it need to stay in my second page
thanks
Finally i got the answer and avoid redirection
bool reset;
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
if(reset && e.uri.tostring().Equals("MainPage.xaml"))
{
e.Cancel = true;
reset = false
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
reset = e.NavigationMode == NavigationMode.Reset;
}

CefSharp load a page with browser login

I need to ebed a web browser in a Wpf app, I tried with the one from the toolbox but get some issues and went to CefSharp.
public MainWindow()
{
InitializeComponent();
BrowserSettings settings = new BrowserSettings();
Cef.Initialize(new CefSettings());
CefSharp.Wpf.ChromiumWebBrowser webBrowser = new CefSharp.Wpf.ChromiumWebBrowser();
licence_grid.Children.Add(webBrowser);
webBrowser.Address = "http://myurlToLoad the page";
}
The problem is when I used a normal url the page load.
But when I used the url I intend to use and whith which the user enter his user and password in a browser pop up (I mean not a pop up from the website) . I get an error with this page take yoo much time to load and nothing else.
Can someone give me some tracks to follow...
Thanks
It sounds like the popup you are referring to is in fact the site prompting for basic authentication.
In that case you need to provide an IRequestHandler.GetAuthCredentials handler.
As the question & answer is very old and i would like to give the latest update on this solution, there is slight change as per original solution suggested.
anybody consuming cefsharp need to implement the authentication dialog. and changes in method is
bool IRequestHandler.GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy,
string host, int port, string realm, string scheme, IAuthCallback callback)
{
//NOTE: If you do not wish to implement this method returning false is the default behaviour
// We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource.
// shyam - original implemenation.
//callback.Dispose();
//return false;
bool handled = false;
// Instantiate the dialog box
AuthDialog dlg = new AuthDialog(host); // create new dialog with username and password field.
// Open the dialog box modally
dlg.ShowDialog();
if (dlg.DialogResult == System.Windows.Forms.DialogResult.OK)
{
// The user did not cancel out of the dialog. Retrieve the username and password.
callback.Continue(dlg.UserName,dlg.Password);
handled = true;
}
return handled;
}

Remove 2 Entries from Navigation Journal

In my windows phone 8 app i have to check if user is already login or not before navigating to different pages. If user is not logged in i navigate the user to Login.xaml from where user chooses either login from Facebook or twitter or cancel.
Now when user successfully logs in i navigate the user to appropriate page. My question is how to remove those potential 2 pages (login.xaml and facebook/twitter login)?
NavigationService.BackStack is IEnumerable :(
does anyone has a work around?
If it is the same as using the WPF NavigationService then you can use RemoveBackEntry after you have navigated to the new page.
Update:
If you are using code such as
if (!user.IsLoggedIn)
{
NavigationService.Navigate(new Login());
}
Then you can remove the back entries before anyone has a chance to see them
if (!user.IsLoggedIn)
{
NavigationService.Navigate(new Login());
//Hide back entry
NavigationService.RemoveBackEntry();
}
However if you are unable to do this, for example when you end up with a Facebook/twitter url in the back entry, then instead subscribe to the Navigated event and then remove them
public Login()
{
NavigationService.Navigated += HideEntriesOnNavigated;
}
void HideEntriesOnNavigated(object sender, NavigationEventArgs e)
{
if (IsFacebookLogin(e.Url)
|| IsTwitterLogin(e.Url)
|| IsAppLoginPage(e.Url))
{
NavigationService.RemoveBackEntry();
}
}

Launch default web browser, but not if URL already open

I have a link on my app UI that launches a URL using System.Diagnostics.Process.Start(). If the user clicks the link several times, it opens several tabs.
Is there a way, maybe a command-line option, to still use the default web browser, but have it just reopen the same tab if the URL is already open? It would be OK if it doesn't work with every possible browser out there, but nice if it at least works with IE, Firefox and Chrome.
I doubt it, but since I didn't see any other questions/answers on this topic, I figured I'd ask.
This is somewhat of a workaround but it might get you started. I have used the System.Diagnostics.Process.ProcessId.
As an example I have used IE, I will explain later why I did this. The code is just "quick and dirty" but I just made it as proof of concept.
I have created a basic WinForm app with one button that will open google in IE, if it has already been opened by the application it will not be opened again.
I added the System.Diagnostics reference.
public int ProcessID;
public Form1()
{
InitializeComponent();
}
private void MyButton_Click(object sender, EventArgs e)
{
if (ProcessID == null)
{
StartIE();
}
else
{
if (!ProcessIsRunning())
{
StartIE();
}
}
}
private bool ProcessIsRunning()
{
bool ProcessRunning = false;
foreach (Process p in Process.GetProcesses())
{
try
{
if (p.Id == ProcessID)
{
ProcessRunning = true;
}
}
catch { }
}
return ProcessRunning;
}
private void StartIE()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "iexplore.exe";
proc.StartInfo.Arguments = "http://www.google.be";
proc.Start();
ProcessID = proc.Id;
}
This does not completely do what you requested but it might be a good start. There are a few reasons why I did it this way and what possible options are..
If you would use the url as the Filename, it would indeed open up the webpage in the default browser, it would however not return a processID. This is why the snippet shows usage of IE. (If you would use this option, you could use the System.IO.File.Exists to make sure the desired browser is installed)
If you would like to use this option, you can query the registry to pick up what te default browser is, if you have that you could launch that from the value obtained from the registry. If you then change the process.startinfo.filename to this value, then you will launch the default browser but you will still obtain a processId so this might be the way forward. You can check how to do this over here: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b200903e-ce69-4bd4-a436-3e20a7632dc4
Showing the internet window if it would already be opened, can be done by using the SetForegroundWindow property. As this is already documented in this article, I did not add it in this snippet.
I hope this helps to get you on your way.

How to detect a browser refresh from Silverlight 4?

My Silverlight 4 application keeps in contact with a server side through a wcf service. Whenever the user refreshes, navigates away or terminates the browser I should do some cleanup towards the server side.
I can not use the Application Exit event; my wcf client is dead before it eventually gets called. I can not use the (new in SL4) FrameworkElement Unloaded event; it ain't called when the Silverlight app shuts down.
So, how do I detect the browser refresh, newpage or shutdown in time to do my cleanup?
BaBu,
I do this exact thing when a user navigates away from my Silverlight app (or does a refresh). Follow the steps below to catch this event.
1.) Start by listening for the HTML page's "onbeforeunload" event, like so...
public void Application_Startup(object sender, StartupEventArgs e)
{
bool ok = HtmlPage.Window.AttachEvent("onbeforeunload", Application_BeforeExit);
ok = HtmlPage.Document.AttachEvent("onbeforeunload", Application_BeforeExit);
MainPage mainPage = new MainPage();
base.RootVisual = mainPage;
}
2.) Implement Application_BeforeExit() to setup and call an ASP.NET "PageMethod", like so...
private void Application_BeforeExit(object sender, HtmlEventArgs args)
{
string methodName = "ModelShutdown";
params object[] args = new Guid().ToString());;
try
{
ScriptObject pageMethods = (ScriptObject)HtmlPage.Window.GetProperty("PageMethods");
if (pageMethods == null)
throw new ArgumentException("Web page does not support PageMethods");
object[] pageMethodArgs = { new PageMethodEventHandler(Success), new PageMethodEventHandler(Failure), null/*userContext*/};
object[] combinedArgs = new object[args.Length + pageMethodArgs.Length];
args.CopyTo(combinedArgs, 0);
pageMethodArgs.CopyTo(combinedArgs, args.Length);
pageMethods.Invoke(methodName, combinedArgs);
}
catch (Exception ex)
{
//ex.Alert();
}
}
3.) Add the PageMethod to your page code behind (Index.aspx.cs), like so,
public partial class Index : Page
{
[WebMethod] // a PageMethod called from Silverlight
public static void ModelShutdown(string identifier)
{
System.Diagnostics.Debug.WriteLine("*** Signing Off: " + identifier);
}
}
4.) Allow PageMethods on your page (Indx.aspx), like so,
<asp:ScriptManager runat="server" EnablePageMethods="true" />
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
Good luck,
Jim McCurdy, YinYangMoney.com
I don't think you can do anything server side after the user has decided to navigate away or browser is terminated. However you can write some JavaScript to prevent unloading of the current page where you can warn the user not to close it.
Second, use a small session timer that ticks every two minutes or so. Your session should timeout but when your Silverlight application is open and running in the browser, you should ping your server by writing some ping method that will keep your session alive every one minute.
So if your session is expiring (it didn't receive ping in the last 60 seconds), your session will be destroyed and you can write some cleanup code at the server's session end.
I had a similar requirement for an MVC app. What I did was use jQuery to subscribe to the unload event and make an ajax call to a controller action that killed the session:
$(window).unload(function() {
$.ajax({url: Url.Action("KillSession")});
});
public ActionResult KillSession()
{
Session.Abandon();
return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotModified);
}

Resources