2012-10-24 35 views
6

Tôi đã nghiên cứu Android gần đây và tôi đã cố gắng chuyển một trong các chức năng của nó sang khung công tác nhỏ gọn C#.Cố gắng đóng một biểu mẫu sau biểu mẫu tiếp theo được hiển thị trong C# cf

Điều tôi đã làm là tạo lớp Tóm tắt mà tôi gọi là Hoạt động. Lớp này trông như thế này

internal abstract class Activity 
    { 
     protected Form myForm; 
     private static Activity myCurrentActivity = null; 
     private static Activity myNextActivity = null; 

     internal static void LoadNext(Activity nextActivity) 
     { 
     myNextActivity = nextActivity; 
     if (myNextActivity != null) 
     { 
      myNextActivity.Show(); 
      if (myCurrentActivity != null) 
      { 
       myCurrentActivity.Close(); 
       myCurrentActivity = null; 
      } 
      myCurrentActivity = myNextActivity; 
      myNextActivity = null; 
     } 
     } 

     internal void Show() 
     { 
     //PROBLEM IS HERE 
     Application.Run(myForm); 
     //myForm.Show(); 
     //myForm.ShowDialog(); 
     // 
     } 

     internal void Close() 
     { 
     myForm.Close(); 
     } 


     internal void GenerateForm() 
     { 
     ///Code that uses the Layout class to create a form, and then stores it in myForm 
     //then attaches click handlers on all the clickable controls in the form 
     //it is besides the point in this problem 
     } 

     protected abstract void Click(Control control); 
     //this receives all the click events from all the controls in the form 
     //it is besides the point in this problem 

    } 

Tôi có vấn đề là với chạy một phần của Show() lệnh

Về cơ bản tất cả các lớp học của tôi thực hiện các lớp trên, tải một file xml và hiển thị nó. Khi tôi muốn chuyển đổi sang một class mới/mẫu (ví dụ đi từ ACMain để ACLogIn) tôi sử dụng mã này

Activity.LoadNext(new ACLogIn); 

nào là nghĩa vụ phải tải các hình thức tiếp theo, hiển thị nó, và dỡ bỏ các hình thức hiện tại

tôi đã thử những giải pháp này (trong phương pháp Show()) và đây là vấn đề với mỗi một

  1. sử dụng myForm.ShowDialog()
    này hoạt động, nhưng khối thi, điều đó có nghĩa rằng hình thức cũ không đóng, và tôi càng di chuyển giữa các hình thức càng quá trình ngăn xếp tăng

  2. sử dụng myForm.Show()
    này hoạt động, đóng cửa dưới dạng cũ sau khi cũ được hiển thị, nhưng ngay sau đó đóng chương trình và kết thúc nó

  3. sử dụng Application.Run(myForm)
    này chỉ hoạt động trên các hình thức đầu tiên được nạp, khi tôi chuyển sang hình thức tiếp theo, nó cho thấy sau đó nó ném một ngoại lệ nói " Giá trị không nằm trong phạm vi dự kiến ​​"

Ai đó có thể giúp tôi khắc phục sự cố này hoặc tìm giải pháp thay thế không?

+1

Vấn đề chính là bạn chỉ có thể có 1 Biểu mẫu chính. Xem nếu Aplication có thuộc tính MainForm có thể ghi, sau đó sử dụng nó với Show(). –

Trả lời

5

Nếu bạn thực sự sau khi tạo khuôn khổ của riêng mình cho điều hướng này, bạn cần phải làm việc lại mà bạn đang suy nghĩ. Ví dụ mẫu được chuyển thành Application.Run không bao giờ được đóng - khi đó, Application.Run hoàn thành việc thực thi và (thường) các điểm nhập cảnh static void Main mục nhập của bạn và ứng dụng chấm dứt.

Những gì tôi sẽ đề nghị là bạn nên thay đổi hoạt động của mình hoặc trở thành một UserControl:

public abstract class Activity : UserControl 
{ 
    .... 
} 

hoặc Soạn một

public abstract class Activity 
{ 
    private UserControl m_control; 
    .... 
} 

Sau đó, thay vì đóng cửa và hiển thị hình thức, cha mẹ tất cả của Các hoạt động bên trong Form chính là một container.

Cảnh báo công bằng, điều này sẽ trở nên phức tạp khi bạn bắt đầu muốn hiển thị mọi thứ trong một họa tiết Tab thay vì Ngăn xếp hoặc có chế độ xem chia tách. Khung hình có vẻ đơn giản để tạo ra, nhưng chúng không nên ít nhất tôi sẽ xem xét việc sử dụng một cái gì đó đã được thực hiện trừ khi bạn có lý do thuyết phục để muốn cuộn của riêng bạn.

+0

ý tưởng của bạn tôi, thật sự rất xuất sắc, nó khiến tôi cảm thấy cực kỳ ngu ngốc khi không nghĩ về nó, nó thực sự tốt hơn ý tưởng của tôi về việc mở một mẫu mới trước khi đóng một cái tiếp theo – Cruces

+0

Tôi đã thực hiện tất cả những thay đổi cần thiết cho dự án để kết hợp ý tưởng của bạn Tôi hiện chỉ hiển thị một biểu mẫu và thêm Bảng điều khiển (tôi đã đi kèm với bảng điều khiển) thay vì biểu mẫu cho nó (như tôi đã nói tôi đang sử dụng khung nhỏ gọn, vì vậy mọi thứ hơi lạ một chút) và sau khi thêm nó, tôi loại bỏ cái cũ và nó hoạt động hoàn hảo, ngăn xếp quá trình luôn trống rỗng, và hơn thế nữa, thời gian tải được cắt giảm một nửa. Một lần nữa xin cảm ơn một triệu. bây giờ làm thế nào tôi có thể cung cấp cho bạn một ngôi sao bazzilion? hmm Tôi sẽ tìm ra (: – Cruces

1

Application.Run thường được sử dụng với quá tải mất tham số Form. Đây sẽ là biểu mẫu "chính" có trách nhiệm bắt đầu/hiển thị các biểu mẫu khác. Biểu mẫu "chính" này có thể bị "ẩn". Nhưng, tôi nghĩ đó là một chút khó xử.

Ngoài ra, bạn không cần biểu mẫu chính, bạn có thể sử dụng Application.Run() để bắt đầu máy bơm thông báo xử lý tin nhắn Windows; nhưng, sau đó luồng đang bận xử lý tin nhắn và không thể hiển thị hộp thoại (chúng phải được hiển thị trong chuỗi đang chạy Application.Run). Bạn có thể làm được việc này bằng cách tạo một hoặc nhiều đối tượng hình thức trước gọi Application.Run và các đối tượng hình thức có thể tạo ra một đối tượng Timer rằng sẽ gọi Form.Show() hoặc Form.ShowDialog() trên handler Timer.Tick sự kiện để cho mẫu được hiển thị sau khi cuộc gọi đến Run. Tôi nghĩ rằng đây là một chút khó xử là tốt.

Cả hai giải pháp này đều loại bỏ cách bạn dự kiến ​​sử dụng Windows và WinForms; vì vậy, tôi nghĩ bạn cần suy nghĩ về việc thiết kế lại ứng dụng này để làm việc với cách Windows và .NET hoạt động.

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