2009-05-20 32 views
14

Tôi có ứng dụng .NET 3.5 MDI WinForms.Sự cố với biểu tượng tạo biểu mẫu con MDI tối đa mới trong .NET

Tôi đặt thuộc tính Icon của biểu mẫu con và biểu tượng hiển thị chính xác ở góc trên cùng bên trái của biểu mẫu. Sau đó tôi tối đa hóa biểu mẫu con và biểu tượng vẫn OK.

Với biểu mẫu con vẫn được tối đa, tôi mở một cửa sổ con khác, cửa sổ này tự động được phóng to tối đa. Biểu tượng của biểu mẫu này không phải là biểu tượng trong thuộc tính Icon, nhưng biểu tượng .NET mặc định (biểu tượng có hình vuông màu xanh lam, đỏ và vàng). Tuy nhiên, nếu tôi đổi kích thước biểu mẫu cha mẹ MDI, biểu tượng sẽ tự đặt lại chính nó và hiển thị chính xác.

Có ai có cách giải quyết hoặc biết lý do điều này xảy ra không?

+0

Các bạn đã thử làm một .Refresh trên cửa sổ con sau khi mở nó? –

Trả lời

8

phải tôi đã tìm thấy một giải pháp ...

Cách giải quyết của việc này là để thiết lập các biểu tượng một lần nữa trên các sự kiện load của form con như sau:

private void StatsForm_Load(object sender, EventArgs e) 
{ 
    //bug that means you have to set the desired icon again otherwise it reverts to default when child form is maximised 
    Icon = new System.Drawing.Icon("research.ico"); 
} 

này có nghĩa là bạn trước tiên sẽ phải thêm tệp biểu tượng được đề cập vào dự án/giải pháp VS của bạn và đặt thành "Sao chép Luôn luôn" để được sao chép khi giải pháp của bạn được tạo.

HTH Calanus

+2

Hoạt động như một sự quyến rũ. Cảm ơn. Vì lý do gì đó tôi không bao giờ nghĩ thử đặt lại biểu tượng. Nó cũng hoạt động như một tài nguyên nhúng, vì vậy bạn không có một tấn (thay thế) các tập tin ngồi trong thư mục cuối cùng. –

4

tôi thấy rằng giải pháp duy nhất là tắt và sau đó kích hoạt lại các con MDI:

document.Show(); 
// Work-around for error in WinForms that causes MDI children to be loaded with the default .NET icon when opened maximised. 
ActivateMdiChild(null); 
ActivateMdiChild(document); 

Đây là giải pháp được đưa ra trong this reply on MSDN forums và nó làm việc cho tôi.

+0

Nó hoạt động, nhưng tạo ra một vấn đề nếu bạn sử dụng ShowDialog bất cứ nơi nào. – Drake

+0

Loại sự cố gì? –

+0

Nếu bạn sử dụng ShowDialog thay vì Hiển thị trong mã của bạn, khối thực hiện trên cuộc gọi đó. Chỉ khi hộp thoại được đóng lại, các cuộc gọi đến ActivateMdiChild chạy, nhưng lệnh thứ hai sẽ không hoạt động vì 'tài liệu' không còn tồn tại tại thời điểm đó – alldayremix

0

Giải pháp của tôi: Để thuộc tính MdiChild "ShowIcon" được đặt thành true, chỉ định biểu tượng trong suốt 1x1. Đã giải quyết được sự cố.

+1

Có thể tôi đang thiếu thứ gì đó, nhưng tôi không chắc chắn cách thức này áp dụng cho câu hỏi ban đầu. Vấn đề không phải là một biểu tượng hiển thị khi tôi không muốn, nhưng biểu tượng * tôi muốn hiển thị * không hiển thị và thay vào đó được thay thế bằng mặc định. –

0

Cách giải quyết tốt nhất mà tôi tìm thấy để khắc phục vấn đề này là here.

aNewForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog 
AddHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

aNewForm.Show() 
aNewForm.WindowState = FormWindowState.Maximized 

RemoveHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

handler

Protected Sub Form_SizeChanged(ByVal sender As Object, ByVal e As EventArgs) 

    If WindowState = FormWindowState.Maximized Then 
     If FormBorderStyle <> FormBorderStyle.Sizable Then FormBorderStyle = FormBorderStyle.Sizable 
    End If 

End Sub 
1
form.WindowState = FormWindowState.Normal 
form.Show() 
form.WindowState = FormWindowState.Maximized 
form.Show() 

Giải Quyết vấn đề của tôi!

3
private void frmChild_Shown(object sender, EventArgs e) 
{ 
    // Work-around for maximized BUG 
    this.Icon = this.MdiParent.Icon; 
    this.WindowState = FormWindowState.Normal; 
    this.WindowState = FormWindowState.Maximized; 
} 
11

Một sửa đổi chút ít để Calanus' giải pháp:

private void MdiBase_Load(object sender, EventArgs e) 
    { 
     // Fixes bug where loading form maximised in MDI window shows incorrect icon. 
     this.Icon = Icon.Clone() as Icon; 
    } 

này cho phép bạn thiết lập các biểu tượng ở thời gian thiết kế (giống như bạn sẽ cho các hình thức khác), và không cần bất kỳ mã hóa cứng truy cập tài nguyên hoặc tệp.

2

Tôi phát hiện ra điều này cũng sẽ khắc phục được sự cố.

myForm.WindowState = FormWindowState.Normal; 
myForm.Show(); 
myForm.WindowState = FormWindowState.Maximized; 
0

Thêm này như dòng đầu tiên trong phương pháp Form_Load trên MDI Trẻ em làm việc cho tôi:

this.Icon = new Icon(this.Icon, this.Icon.Size); 
Các vấn đề liên quan