2009-10-01 36 views
5

Tôi đang xây dựng một ứng dụng WinForms và tôi đang sử dụng các màu cụ thể trên hầu hết các điều khiển. Tôi làm điều đó đôi khi từ các nhà thiết kế WinForms, và đôi khi trực tiếp vào mã của tôi.Làm cách nào tôi thực hiện mã màu ứng dụng trong ứng dụng WinForm?

Tôi có một lớp tĩnh đâu đó trông như rằng:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

    } 

tôi có thể sử dụng những màu sắc trong mã của tôi khá dễ dàng, nhưng nó không thể làm từ các nhà thiết kế, điều này làm tăng lỗi này:

MyColors.DarkGreen không phải là giá trị hợp lệ cho Int32.

(Tôi đã cố gắng để lưu trữ các đại diện Int32 của những màu sắc, nhưng điều này không thành công với các lỗi tương tự)

Giải pháp Tôi đang sử dụng ngay bây giờ là sử dụng mã rgb màu trong thiết kế , các giá trị lớp MyColors trong mã của tôi và tôi đang thực hiện các thay đổi bằng cách thay thế tất cả các chức năng của Visual Studio. Đây không phải là một giải pháp tốt đẹp, nhưng tôi đã không thể tìm thấy một ý tưởng tốt hơn cho đến nay.

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


Lưu ý: Tôi biết về this question, đó là hơi khác với tôi, như tôi không nhìn vào cách thay đổi "KnownColors".

Trả lời

2

Để nhận hỗ trợ thiết kế cho các định nghĩa màu bổ sung của bạn, bạn có thể cần phải tạo trình chỉnh sửa của riêng bạn để mở rộng hoặc thay thế trình chỉnh sửa Color. Một khi bạn đã xác định những điều này, sau đó bạn sẽ cần phải nói cho các nhà thiết kế mà các thuộc tính nên sử dụng trình soạn thảo của bạn bằng cách áp dụng thuộc tính Editor cho các thuộc tính bị ảnh hưởng.

Bạn cũng có thể đạt được một số thành công bằng cách thực hiện điều gì đó tương tự với TypeConverterTypeConverterAttribute.

+0

@ Jeff: vì tôi muốn cập nhật màu sắc của các nút điều khiển winforms mặc định (nút, nhãn, v.v.), tôi không thể áp dụng thuộc tính Editor cho thuộc tính ForeColor/BackColor, trừ khi tôi kế thừa tất cả các điều khiển đó nghe có vẻ hơi quá mức với tôi ... hay tôi đã bỏ lỡ điều gì đó? – Brann

+0

@Brann: Bạn đã được kế thừa bằng cách triển khai biểu mẫu của mình. Bạn sẽ phải áp dụng nó để ghi đè trong biểu mẫu của riêng bạn. –

+0

Tất nhiên, các điều khiển trong biểu mẫu sẽ cần phải được đặt thành Color.Empty để kế thừa từ kiểm soát gốc của chúng hoặc bạn cũng cần phải ghi đè các điều khiển đó. Tôi không tin rằng có một sự thay thế để có được sự hỗ trợ của nhà thiết kế, tôi sợ. –

2

Tôi không nghĩ rằng điều này là có thể, bởi vì bạn sẽ cần thay đổi hành vi của cửa sổ Thuộc tính. Nhập vào "255, 128, 64" hoạt động vì cửa sổ Thuộc tính chứa mã cố gắng biến bất kỳ thứ gì được nhập vào màu hệ thống, màu "web", hoặc màu RGB được chỉ định và hiển thị "blah blah blah" không phải là giá trị hợp lệ cho Int32. " tin nhắn cho bất kỳ văn bản nào mà nó không thể chuyển đổi như vậy (như "MyColors.DarkGreen").

+1

Bạn có thể ghi đè hành vi này bằng cách cung cấp TypeConverter của riêng bạn, nhưng bạn cần phải ghi đè các điều khiển để thêm vào các thuộc tính để nó hoạt động. –

+0

@ Jeff: Tôi tin bạn, và như là điển hình cho StackOverflow, tôi nhận được phiếu để nói "bạn không thể làm điều này" trong khi bạn nhận được không có phiếu bầu (cho đến khi tôi) cho thấy làm thế nào bạn có thể làm điều này. :) – MusiGenesis

1

Đặt cược tốt nhất của bạn là có lẽ không cố gắng làm bất cứ điều gì trong nhà thiết kế. Chỉ cần để lại tất cả các biểu mẫu của bạn với các màu mặc định tại thời điểm thiết kế.

Tôi đã tham gia vào các dự án có sơ đồ tương tự như chương trình của bạn và tất cả các loại sự cố đều xuất hiện. Một nút đã được đặt thành giá trị RGB trong trình thiết kế; Một nút khác trên cùng một mẫu có màu được đặt trong mã (từ lớp tĩnh) và hai màu hơi khác nhau. Theo thời gian, các vấn đề này sẽ xuất hiện.

Nếu bạn muốn thay đổi màu, bạn sẽ phải thay đổi lớp tĩnh và kiểm tra tất cả các biểu mẫu của bạn. Sự khác biệt tinh tế sẽ không rõ ràng.

Nếu bạn đặt tất cả các màu của bạn trong mã, nếu bạn bỏ lỡ một điều khiển, nó sẽ ngay lập tức được rõ ràng. Nếu bạn quyết định thay đổi màu, bạn chỉ cần thay đổi màu đó ở một nơi.

Một tinh chỉnh khác mà chúng tôi đã làm là thêm thành viên vào lớp tĩnh có sử dụng được đề cập trong tên của họ.

Ví dụ:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

     public static Color ButtonBackColor = DarkGreen; 
    } 

Bằng cách này, nếu bạn muốn thay đổi tất cả các nút của bạn từ DarkGreen đến Orange, nó chỉ là một sự thay đổi một dòng.

0

Điều này sẽ cho bạn kết quả mà bạn đang tìm kiếm. Có thể có quá nhiều dấu ngoặc đơn mà bạn có thể xóa.

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62))))); 
1

Nếu bạn đang cố gắng để có một cách tiếp cận chủ đề, nhãn tức là với backcolor và ForeColor thuộc tính cố định tạo ra một thành phần và thay đổi mã của nó đằng sau như dưới đây:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace YourNameSpace 
{ 
    public partial class NameOfStaticColoredLabel : Label 
    { 
     public NameOfStaticColoredLabel() 
     { 
      InitializeComponent(); 
     } 

     public NameOfStaticColoredLabel(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     public override Color ForeColor 
     { 
      get 
      { 
       return Color.Black; 
      } 
      set 
      { 
       base.ForeColor = Color.Black; 
      } 
     } 

     public override Color BackColor 
     { 
      get 
      { 
       return Color.Aquamarine; 
      } 
      set 
      { 
       base.BackColor = Color.Aquamarine; 
      } 
     } 
    } 
} 

Như bạn có thể thấy tất cả các bạn phải làm là ghi đè các thuộc tính liên quan của điều khiển nhãn. Sau đó, bạn kéo và thả nhãn này trong các biểu mẫu đăng ký của mình. Khi bạn cần phải thay đổi màu sắc của họ chỉ cần làm điều đó trong lớp trên và xây dựng lại ứng dụng. Cách tiếp cận này sẽ tạo ra một nhãn màu tĩnh và bạn không thể thay đổi màu của nó từ nhà thiết kế hoặc mã.

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