2010-10-07 25 views
7

Tôi tất cả mọi người. Tôi hiện đang gặp vấn đề với tiêu điểm của mình khi sử dụng màn hình giật gân. Tôi đang sử dụng VS2008, với .NET framework 2.0. Ngoài ra, tôi đã liên kết dự án của tôi với VisualBasic.dll vì tôi sử dụng ApplicationServices để quản lý ứng dụng cá thể và màn hình giật gân của mình.Màn hình Splash không trả về tiêu điểm ở dạng chính

Đây là đoạn mã được đơn giản hóa về những gì tôi đã thử gỡ lỗi.

namespace MyProject 
{ 
    public class Bootstrap 
    { 
     /// <summary> 
     /// Main entry point of the application. It creates a default 
     /// Configuration bean and then creates and show the MDI 
     /// Container. 
     /// </summary> 
     [STAThread] 
     static void Main(string[] args) 
     { 
      // Creates a new App that manages the Single Instance background work 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      App myApp = new App(); 
      myApp.Run(args); 
     } 
    } 

    public class App : WindowsFormsApplicationBase 
    { 
     public App() 
      : base() 
     { 
      // Make this a single-instance application 
      this.IsSingleInstance = true; 
      this.EnableVisualStyles = true; 

      // There are some other things available in the VB application model, for 
      // instance the shutdown style: 
      this.ShutdownStyle = Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses; 

      // Add StartupNextInstance handler 
      this.StartupNextInstance += new StartupNextInstanceEventHandler(this.SIApp_StartupNextInstance); 
     } 

     protected override void OnCreateSplashScreen() 
     { 
      this.SplashScreen = new MyMainForm(); 
      this.SplashScreen.StartPosition = FormStartPosition.CenterScreen; 
     } 
     protected override void OnCreateMainForm() 
     { 
      // Do your initialization here 
      //... 
      System.Threading.Thread.Sleep(5000); // Test 
      // Then create the main form, the splash screen will automatically close 
      this.MainForm = new Form1(); 
     } 
     /// <summary> 
     /// This is called for additional instances. The application model will call this 
     /// function, and terminate the additional instance when this returns. 
     /// </summary> 
     /// <param name="eventArgs"></param> 
     protected void SIApp_StartupNextInstance(object sender, 
      StartupNextInstanceEventArgs eventArgs) 
     { 
      // Copy the arguments to a string array 
      string[] args = new string[eventArgs.CommandLine.Count]; 
      eventArgs.CommandLine.CopyTo(args, 0); 

      // Create an argument array for the Invoke method 
      object[] parameters = new object[2]; 
      parameters[0] = this.MainForm; 
      parameters[1] = args; 

      // Need to use invoke to b/c this is being called from another thread. 
      this.MainForm.Invoke(new MyMainForm.ProcessParametersDelegate(
       ((MyMainForm)this.MainForm).ProcessParameters), 
       parameters); 
     } 
    } 
} 

Bây giờ, điều xảy ra là khi tôi khởi động ứng dụng, màn hình Splash hiển thị như mong đợi, nhưng khi nó bị hủy, nó sẽ không trả tiêu điểm về biểu mẫu chính (Form1 trong thử nghiệm). MainForm chỉ đơn giản là nhấp nháy màu cam trên thanh tác vụ. Nếu tôi khởi chạy ứng dụng từ IDE (VS2008), tiêu điểm hoạt động tốt. Tôi đang sử dụng XP Pro. Ngoài ra, hình thức chính không phải là trên đầu trang của mỗi cửa sổ khác. Nếu tôi nhận xét phương thức OnCreateSplashScreen(), ứng dụng sẽ tập trung bình thường.

Để kiểm tra việc thực hiện bình thường, tôi đang sử dụng Dấu nhắc lệnh VS để khởi chạy ứng dụng của mình. Tôi đang sử dụng phiên bản Release của dự án của tôi.

Bất kỳ ý tưởng nào?

Chỉnh sửa: Tôi cũng xử lý sự kiện StartUpNextInstance để gửi các đối số dòng lệnh của tôi tới biểu mẫu chính của tôi. Đối với mục đích thử nghiệm, nó đã được gỡ bỏ ở đây.

Chỉnh sửa: Đã thêm mã một chút. Bây giờ bạn có toàn bộ mức độ của bootstrap của tôi.

+0

Đây là mã của tôi. SO thực hiện điều này khá nghiêm túc, phân bổ là bắt buộc. Bạn phải bao gồm một liên kết đến mã gốc và tên của tác giả. –

+0

Tôi đã lấy mã này từ lâu (tháng tháng tôi nghĩ) và chỉ được thêm vào cho SplashScreen. Xin lỗi nếu đó là của bạn để bắt đầu. Làm cách nào để thêm thuộc tính và liên kết của bạn? – Olyan

Trả lời

3

Câu hỏi không chi tiết.

1) Mối quan hệ giữa SplashScreen và biểu mẫu chính của ứng dụng là gì?

2) SplashScreen tự động đóng như thế nào?

Tôi chắc chắn vấn đề ở đây là biểu mẫu chính đã bắt đầu tải lên trong nền trong khi SplashScreen vẫn chưa đóng. Do thời gian không tốt, biểu mẫu chính sẽ tải lên trong nền và tải xuống màn hình SplashScreen ... do đó đèn flash trên thanh tác vụ.

Làm cho chúng xuất hiện theo cách được kiểm soát nối tiếp. Có rất nhiều cách. Tôi không thể đề xuất chính xác làm thế nào vì hầu như không có chi tiết nào được cung cấp. Giống như những gì đang VB làm trong dự án, bao nhiêu chủ đề đang hoạt động, các hình thức tùy chỉnh sử dụng ở đây là gì .. vv

EDIT:

Thuật toán để thực hiện Splash màn hình (IMHO) :)

1) Tạo biểu mẫu tùy chỉnh - màn hình giật gân

2) Chạy trên một chuỗi riêng biệt. Thực hiện hành vi của nó như bạn muốn.

3) Trong biểu mẫu màn hình giật gân của bạn, hãy viết trình xử lý để nắm bắt trình xử lý sự kiện dỡ hàng tùy chỉnh đóng biểu mẫu màn hình giật gân.

4) Bây giờ, trở lại trong chuỗi chính, tạo cho bạn mẫu ứng dụng chính. Đặt thuộc tính Visible thành false.

5) Viết trình xử lý ngay cả đối với sự kiện Load của biểu mẫu chính.Trong trình xử lý này, kích hoạt một sự kiện để giật màn hình để dỡ bỏ. Sau đó, hiển thị biểu mẫu chính.

+0

Trên thực tế, khung công tác VisualBasic thực hiện công việc tự động liên quan đến SplashScreen. Nó sẽ tự động hiển thị và khi biểu mẫu chính được hiển thị, nó sẽ phá hủy màn hình giật gân. Tôi chỉ chạy thread chính. Quá trình tải của tôi được thực hiện trong OnCreateMainForm nơi // Do bạn khởi tạo ở đây là. – Olyan

+0

VB FW đó có thể là vấn đề. Như bạn đã nói, nó phá hủy màn hình giật gân khi tải biểu mẫu chính, sau đó tiêu điểm có thể chuyển sang màn hình giật gân trong hành động gần giống của nó. Tôi không biết, nhưng bạn cần phải kiểm tra VB FW u r sử dụng. Bạn đang sử dụng nó chỉ cho giật gân?Nó có thể được thực hiện trong C# cũng như không có VB FW. – Nayan

+0

Tôi bắt đầu sử dụng nó cho ứng dụng SingleInstance. Đó là một sự quyến rũ cho điều đó. Nó chuyển các đối số dòng lệnh của tôi tới ứng dụng đã mở và mọi thứ. Tôi chỉ thêm splashscreen một vài ngày trước kể từ khi khởi tạo của tôi có thể có một số tin nhắn để hiển thị cho người dùng thông qua MessageBox, vì vậy tôi cần một phần tử GUI để có mặt. – Olyan

0

Điều gì sẽ xảy ra nếu bạn đặt tiêu điểm một cách rõ ràng trong sự kiện Tải Form1 của mình?

+0

Tôi đã thử đặt this.Focus() bên trong sự kiện được hiển thị, nó không khắc phục được sự cố. Nhưng bây giờ tôi đang bối rối. Đôi khi tập trung làm việc tốt, đôi khi nó không. – Olyan

0

Vì một số lý do không rõ ràng, tiêu điểm dường như hoạt động chính xác. Tôi sẽ cố gắng và kết hợp nhiều việc thực hiện bình thường của chương trình chính của tôi vào MyMainForm và cố gắng tìm những gì thực sự khiến cho sự thay đổi tập trung thất bại. Tôi sẽ giữ cho tất cả các bạn được đăng.

+0

Tôi nói đó là may mắn của bạn! :) Hãy cho chúng tôi biết! – Nayan

+0

Có vẻ như tôi đã mất một ngày vì VS. Tôi chỉ đơn giản là xóa các thư mục bin và obj, biên dịch lại mọi thứ với giải pháp ban đầu của tôi, mọi thứ đều hoạt động tốt. Xin lỗi cho tất cả các mớ hỗn độn này. – Olyan

+0

Vâng, tôi quay lại với cùng một câu hỏi. Vì một lý do không rõ, nó chỉ hoạt động tạm thời. Và tôi đã không thay đổi bất kỳ mã nào. Điều gì đã xảy ra để nó hoạt động trong khoảng thời gian ngắn ngủi đó, tôi không biết. Và tôi thực sự không có ý tưởng. – Olyan

3

Bạn cần gọi phương thức Activate() trên biểu mẫu chính để hiển thị chính xác.

2

Trong một số việc triển khai biểu mẫu giật gân của tôi trên một chuỗi khác nhau, tôi cũng đã thấy tình huống này.

thường nếu tôi gọi this.Activate(); làm dòng mã đầu tiên của tôi trong tải biểu mẫu có xu hướng hoạt động như mong đợi. đặt này sau khi ẩn giật gân thường không hoạt động chính xác.

các phương pháp khác có thể hữu ích.

this.BringToFront(); 
this.TopMost = true; //setting this to true and back to false sometimes can help 
0

thử gọi form1.show() sau this.MainForm = new Form1(); Nó làm việc cho tôi.

0

Tôi gặp vấn đề tương tự và muốn giải pháp dễ dàng cho việc này.

Tôi đã thử ở trên nhưng không có may mắn, nhưng ý tưởng từ thông tin hữu ích ở trên.

Tôi đã thử lừa và nó hoạt động cho tôi.

Đây là mã Programs.cs của tôi mà làm việc tốt:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     var mainWindow = new frmMain(); 
     splashScreen.DisplaySplashScreen(mainWindow, 10000); 
     **mainWindow.TopMost = true;** 
     Application.Run(mainWindow); 
    } 
} 

Thông báo các mainWindow.TopMost = true;

Ok đã được làm việc đủ nhưng tôi không muốn các MainWindow để ở trên đầu.

Vì vậy, trong Shown kiện i thêm this.TopMost = false;

private void frmMain_Shown(object sender, EventArgs e) 
    { 
     this.TopMost = false; 
    } 

Bây giờ ứng dụng của tôi đang làm việc như tôi muốn nó hoạt động.

Lưu ý: Chỉ cần đăng để giúp bất kỳ người dùng nào khác gặp phải vấn đề tương tự với những gì tôi gặp phải.

Mã hóa hạnh phúc :)

Các vấn đề liên quan