2009-08-05 36 views
12

Tôi có thể thay đổi biểu tượng mặc định được sử dụng trên Winform không?Thay đổi Biểu tượng Mặc định Winform Toàn bộ Ứng dụng

Hầu hết các hình thức của tôi có sở hữu biểu tượng của họ thiết lập để một biểu tượng tùy chỉnh. Đối với một số hình thức trượt qua các vết nứt, tôi không muốn biểu tượng "hey nhìn, anh ấy đã làm điều này trong phòng thu trực quan".

Một giải pháp là kiểm tra từng biểu mẫu một cách tẻ nhạt để đảm bảo chúng có biểu tượng tùy chỉnh hoặc đã đặt ShowIcon thành False.

Một giải pháp khác là phải có mọi biểu mẫu của tôi kế thừa từ một lớp cơ sở đặt biểu tượng tùy chỉnh trong hàm tạo.

Bên cạnh những giải pháp, những tùy chọn khác để tôi có?

CHỈNH SỬA: Tôi đã hy vọng sẽ có một cách để thay thế nguồn gốc của biểu tượng cổ phiếu bằng của riêng tôi. Có phải nó nằm trong một tệp tài nguyên ở đâu đó không? Hoặc là nó nhúng trong một dll. NET mà tôi không thể (hoặc thực sự, thực sự không nên) sửa đổi?

BOUNTY EDIT: Có cách nào để thực hiện việc này mà không cần chỉnh sửa hoặc viết một dòng mã không? Tôi không quan tâm như thế nào không thực tế, phức tạp, lãng phí thời gian giải pháp là ... Tôi chỉ muốn biết nếu nó có thể. Tôi cần thỏa mãn sự tò mò của mình.

Trả lời

24

Biểu tượng mặc định được nhúng vào trong winforms dll - nhìn vào phản xạ (DefaultIcon) đó là:

defaultIcon = new Icon(typeof(Form), "wfc.ico"); 

Không có phép thuật trong đó để kiểm tra một địa điểm phổ biến, vì vậy bạn không thể làm được nó mà không thay đổi mã.

Bạn luôn có thể nắm lấy sức mạnh của bóng tối bằng phản xạ dựa trên hiện trường? Lưu ý: đây là hacky và giòn. Trên đầu của bạn! Nhưng hoạt động:

[STAThread] 
static void Main() { 
    // pure evil 
    typeof(Form).GetField("defaultIcon", 
      BindingFlags.NonPublic | BindingFlags.Static) 
     .SetValue(null, SystemIcons.Shield); 

    // all forms now default to a shield 
    using (Form form = new Form()) { 
     Application.Run(form); 
    } 
} 

Để làm điều đó đúng cách; hai lựa chọn phổ biến;

  • cơ sở lớp Form trong đó có các biểu tượng thiết lập
  • một phương pháp nhà máy Form - có lẽ cái gì đó như:

mã:

public static T CreateForm<T>() where T : Form, new() { 
    T frm = new T(); 
    frm.Icon = ... 
    // any other common code 
    return frm; 
} 

Sau đó, thay vì:

using(var frm = new MySpecificForm()) { 
    // common init code 
} 

Một cái gì đó như:

using(var frm = Utils.CreateForm<MySpecificForm>()) { 

} 

Tất nhiên - không đẹp hơn nhiều! Một lựa chọn khác có thể là một phương pháp mở rộng C# 3.0, có lẽ là một API thạo:

public static T CommonInit<T>(this T form) where T : Form { 
    if(form != null) { 
     form.Icon = ... 
     //etc 
    } 
    return form; 
} 

using(var frm = new MySpecificForm().CommonInit()) { 
    // ready to use 
} 

Đây là sau đó chỉ cần một .CommonInit() xa mã hiện tại của bạn.

+0

Được chấp nhận để thực sự tìm biểu tượng ... đủ gần –

+0

Điều này cực kỳ tuyệt vời. Chỉ cần lưu tôi chạy trên 50 biểu mẫu ... –

+0

Tùy chọn phản chiếu hoạt động tốt và với API phản chiếu của Nền tảng O2, mã để làm điều đó không có vẻ đáng sợ typeof (Mẫu) .fieldValue ("defaultIcon", SystemIcons .Cái khiên); –

4

Tùy chọn lớp cơ sở là tùy chọn chúng tôi sử dụng.

Nếu bạn đang tìm kiếm phương án thay thế (không nhất thiết phải tốt), bạn có thể: 1. Sử dụng IOC để khởi tạo tất cả biểu mẫu và sửa đổi vùng chứa IOC để đặt biểu tượng ứng dụng. 2. Sử dụng AOP để chèn mã vào tất cả các biểu mẫu đặt biểu tượng ứng dụng.

Cá nhân, tôi muốn chỉ cần sử dụng lớp cơ sở ...

0

Nếu tất cả các hình thức của bạn là chỉ trong một dự án sau đó bạn có thể lấy dll của dự án và sử dụng phản ánh để có được tất cả các loại trong dll. Nếu loại xuất phát từ Biểu mẫu, bạn có thể đặt thuộc tính Biểu tượng của loại thành bất kỳ thứ gì bạn muốn. Tôi không chắc chắn chi phí thực hiện sẽ là gì nếu dự án là rất lớn.

1

Nếu bạn muốn cập nhật tất cả các biểu tượng bằng nhau, bạn có thể xây dựng một ứng dụng nhỏ mà chỉnh sửa tất cả các file * .Designer.vb (trong vb.net) và thêm dòng folowing để InitializeComponent:

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico") 

Hy vọng điều đó sẽ hữu ích.

2

câu trả lời hữu ích của tôi:

Không

Sẽ là một tính năng tốt đẹp cho microsoft để thực hiện tuy nhiên, vì hầu hết các ứng dụng sử dụng các biểu tượng tương tự trên toàn bộ ứng dụng.

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