2011-01-20 31 views
9

Tôi đang sử dụng đoạn mã sau để mở một hình thức trong một chủ đề mới:Biểu mẫu TopMost trong một chủ đề?

private void button1_Click(object sender, EventArgs e) 
{ 

    Thread thread = new Thread(ThreadProc); 
    thread.Start(); 
} 


public void ThreadProc() 
{ 

    Form form = new Form(); 
    form.TopMost = true; 
    form.ShowDialog(); 
} 

Nhưng hình thức mới được tạo ra không phải là trên cùng mặc dù tôi đặt nó là sự thật.

Làm thế nào tôi có thể làm cho một hình thức trong một topmost chủ đề?

Trả lời

5

Thông thường, bạn không cần phải thread khác, bạn mở biểu mẫu như bình thường trong chế độ modal phương thức hoặc không, nếu hình thức cần phải làm một bộ xử lý mạnh thì bạn làm quá trình này bên trong một chủ đề.

cụ thể cho câu hỏi một lựa chọn của bạn là chạy theo hình thức từ một Application.Run như mô tả here.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(ThreadProc); 
     thread.Start(); 
    } 


    public void ThreadProc() 
    { 
     using (Form1 _form = new Form1()) 
     { 
      _form.TopMost = true; 
      Application.Run(_form); 
     } 
    } 
} 

Điều đó sẽ khởi chạy một luồng mới với bơm thông điệp của chính nó và giữ nguyên nó dưới dạng Biểu mẫu trên cùng.

+0

Ok để tạo nên một hình thức trong một chủ đề mới và cho phép nó trở thành hình thức trên cùng? Tôi sẽ cho nó nó một cơ hội ! thx – syncis

+0

Điều đó thực sự không hoạt động vì nếu tôi "Application.Run (_form);" trong chủ đề mới nó vẫn còn trong một chủ đề mới và vấn đề sẽ vẫn là nó sẽ không trở thành trên cùng, và nếu tôi cố gắng để bắt đầu "Application.Run (_form);" mà không bắt đầu một chủ đề mới (bắt đầu trong chủ đề chính) sau đó tôi nhận được ngoại lệ "Bắt đầu một vòng lặp tin nhắn thứ hai trên một chủ đề duy nhất không phải là một hoạt động hợp lệ." – syncis

+0

Tôi đã sửa đổi với mã hoàn chỉnh hơn, nó tạo ra kết quả mong đợi cho tôi –

1

Chỉ cần chạy vào vấn đề này bản thân mình. Dường như nếu biểu mẫu có số Owner thì TopMost hoạt động như mong đợi. Tuy nhiên, nếu biểu mẫu sở hữu đã được tạo trên một chuỗi khác, thì đó là một chút tricky to set. Đây là những gì tôi đã sử dụng:

var form = new Form(); 

form.Shown += (sender, e) => { 
    Control.CheckForIllegalCrossThreadCalls = false; 
    form.Owner = /* Owning form here */; 
    form.CenterToParent();  // Not necessary 
    Control.CheckForIllegalCrossThreadCalls = true; 

    form.TopMost = true;  // Works now! 
}; 

Application.Run(form); 
+0

Bạn vừa lưu lại ngày. Cảm ơn rất nhiều: D: D – MarshallOfSound

-1
private void button1_Click(object sender, EventArgs e) 
{ 

    Thread thread = new Thread(ThreadProc); 
    thread.Start(); 
} 


public void ThreadProc() 
{ 

    Form form = new Form(); 
    form.TopMost = true; 
    this.Invoke((Action)delegate() { form.ShowDialog(); }); 
} 
+1

Như câu trả lời của bạn là khá không đúng. Hãy xem xét thêm *** tại sao *** điều này có thể là giải pháp. –

+0

bởi vì nó hoạt động! – Daria

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