Reputation: 3218
Here are the basic events I want to happen when my WPF application starts. This is very similar to how Word starts on my machine.
Everything works fine except for the displaying of the busy cursor prior to the splash screen being displayed. When I execute the application through a shortcut, the wait cursor flashes, but soon goes back to the default. I've tried different ways to set the Cursor but none work, but I think the problem is that I'm not in a control/window--I'm doing it from within App.xaml.cs. And, the properties I'm setting seem to be Windows Forms properties. Here is an excerpt from my code in App.xaml.cs.
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
System.Windows.Forms.Application.UseWaitCursor = true;
//System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
//System.Windows.Forms.Application.DoEvents();
Initialize();
SplashWindow splash = new SplashWindow();
splash.Show();
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
// Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
MainWindow main = new MainWindow();
main.Show();
}
Upvotes: 33
Views: 77715
Reputation: 315
For me it worked using a mix of the stuff stated above:
class MyForm : System.Windows.Window {}
class Test{
MyForm myForm;
void ShowWaitCurserInMyForm(){
//before kicking off the stuff I'm waiting for:
System.Windows.Forms.Application.UseWaitCursor = true; // disables all Input from the mouse
myForm.Cursor = System.Windows.Input.Cursors.Wait; // actually displays a wait Cursor
// do time intensive stuff here, if we wait for an event, following stuff belongs in its handler
System.Windows.Forms.Application.UseWaitCursor = false; // reenables all Input from the mouse
myForm.Cursor = null; // reset the Cursor visually
}
}
Upvotes: 0
Reputation: 621
If you have a task that takes a significant amount of time, and it is running on a non-GUI thread, (which is a good idea) you can use this code to change the application cursor:
Application.Current.Dispatcher.Invoke(() =>
{
Mouse.OverrideCursor = Cursors.Wait;
});
When the busy process completes, use this:
Application.Current.Dispatcher.Invoke(() =>
{
Mouse.OverrideCursor = null;
});
Upvotes: 54
Reputation: 229
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
InitializeComponent();
...
Mouse.OverrideCursor = null;
Upvotes: 5
Reputation: 2400
I'm assuming the Initialize() is the part that you want your busy cursor to appear for, yes?
If so, try the following approach:
<Window>
element, set the following properties: Visibility="Hidden"
and Cursor="Wait"
.Visiblity
property to Visible
and resets the Cursor
as well.protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow main = new MainWindow();
main.Show(); // this should set the cursor how you want it
Initialize();
SplashWindow splash = new SplashWindow();
splash.Show();
main.Initialize(); // now invoke the Initialize method you created
// Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
}
Upvotes: 2
Reputation: 26058
This should work
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
Use System.Windows.Input
not System.Windows.Forms
.
Upvotes: 67