2012-06-13 35 views
14

Dưới đây là các sự kiện cơ bản tôi muốn xảy ra khi ứng dụng WPF của tôi bắt đầu. Điều này rất giống với cách Word bắt đầu trên máy tính của tôi.Làm cách nào để hiển thị con trỏ chờ trong khi khởi động ứng dụng WPF?

  1. Hiển thị con trỏ bận.
  2. Thực hiện khởi tạo cơ bản. Quá trình này mất vài giây và cần thực hiện trước khi màn hình hiển thị giật gân được hiển thị.
  3. Hiển thị màn hình giật gân. Màn hình giật gân này hiển thị tiến trình thành khởi tạo sâu hơn và có thể mất một lúc (lưu trữ thông tin từ cơ sở dữ liệu).
  4. Hiển thị con trỏ mặc định. Kể từ khi màn hình splash đang hiển thị tiến trình ngay bây giờ, không cần hiển thị con trỏ bận.
  5. Sau khi hoàn thành quá trình tạo màn hình, hiển thị cửa sổ chính.
  6. Đóng màn hình giật gân.

Mọi thứ hoạt động tốt ngoại trừ việc hiển thị con trỏ bận trước màn hình hiển thị giật gân. Khi tôi thực thi ứng dụng thông qua một phím tắt, con trỏ chờ sẽ nhấp nháy, nhưng sẽ sớm trở lại mặc định. Tôi đã thử nhiều cách khác nhau để thiết lập Con trỏ nhưng không có công việc nào, nhưng tôi nghĩ vấn đề là tôi không nằm trong một cửa sổ điều khiển - tôi đang thực hiện nó từ bên trong App.xaml.cs. Và, các thuộc tính tôi đang thiết lập dường như là các thuộc tính của Windows Forms. Đây là một đoạn trích từ mã của tôi trong 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(); 
} 

Trả lời

38

này nên làm việc

Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; 

Sử dụng System.Windows.Input không System.Windows.Forms.

+0

gia tăng đó và nó vẫn hoạt động giống như trước. Nếu tôi không thiết lập lại OverrideCursor thành null sau khi thiết lập ban đầu, con trỏ đợi được hiển thị khi tôi đặt con trỏ qua cửa sổ. Nhưng, nó không được hiển thị khi ứng dụng ban đầu bắt đầu. – bsh152s

+0

Hmm, tôi đã chơi với nó một lúc, có vẻ rất khó nếu không thể thay đổi con trỏ bên ngoài cửa sổ thực tế (bạn sẽ nhận thấy ngay cả khi mã này con trỏ chờ biến mất khi chuột rời đi cửa sổ). Xin lỗi tôi không thể giúp đỡ nhiều hơn nữa. –

+0

Điều này là tốt. Chỉ cần thiết lập giá trị này. Con trỏ chỉ thay đổi nó cho cửa sổ, nếu bạn di chuột qua một điều khiển bạn sẽ có được con trỏ mặc định chứ không phải con trỏ chờ. Mouse.OverrideCursor dường như đặt con trỏ chờ cho Cửa sổ và mọi thứ trong đó. –

18

Nếu bạn có một nhiệm vụ mà phải mất một số lượng đáng kể thời gian, và nó đang chạy trên một sợi phi-GUI, (đó là một ý tưởng tốt), bạn có thể sử dụng mã này để thay đổi con trỏ ứng dụng:

Application.Current.Dispatcher.Invoke(() => 
{ 
    Mouse.OverrideCursor = Cursors.Wait; 
}); 

Khi quá trình bận rộn hoàn tất, sử dụng này:

Application.Current.Dispatcher.Invoke(() => 
{ 
    Mouse.OverrideCursor = null; 
}); 
2

tôi giả định Initialize() là phần mà bạn muốn con trỏ bận rộn của bạn xuất hiện cho, đúng không?

Nếu vậy, hãy thử các phương pháp sau đây:

  1. Trong MainWindow.xaml của bạn, trên các yếu tố <Window>, thiết lập các thuộc tính sau: Visibility="Hidden"Cursor="Wait".
  2. Trong tệp MainWindow.xaml.cs của bạn, hãy di chuyển mã khởi tạo ra khỏi hàm tạo và vào phương thức Initialize() công khai, để bất kỳ mã nào phụ thuộc vào lệnh Initialize() không được thực hiện. Đảm bảo rằng kết thúc phương thức Initialize() của bạn đặt thuộc tính Visiblity thành Visible và đặt lại số Cursor.
  3. Cập nhật đoạn mã đăng tải trên một cái gì đó như sau:
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. 
} 
0
 Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; 
     InitializeComponent(); 
     ... 
     Mouse.OverrideCursor = null; 
Các vấn đề liên quan