2015-08-31 27 views
8

Có thể thay đổi màu đường viền của danh sách thả xuống trình đơn dao động hay không.Thay đổi màu đường viền của danh sách thả xuống của menu Winforms

Trong mẫu bên dưới, tôi muốn trình đơn thả xuống có 1 màu (xanh dương) mà không có đường viền màu trắng hiện đang bị dịch chuyển, nhưng vẫn giữ menu chính (mục 'Trình đơn của tôi') màu trắng.

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

enter image description here

+0

Bạn đang tìm kiếm những câu hỏi này: http://stackoverflow.com/questions/13235627/how-to-change-the-appearance-of-a-menustrip? –

+0

Hmm, có thể trùng lặp. Nhưng tôi vẫn không biết những gì tài sản để ghi đè lên để có được hiệu quả mong muốn. Tôi đã thử MenuItemBorder và MenuBorder nhưng nó không thay đổi. –

+1

Để thay đổi màu đường viền, đủ để làm theo giải pháp @Plutonix được mô tả trong câu trả lời được chấp nhận. Nhưng để loại bỏ đường viền màu trắng đó giữa đường viền của mục và menu, hãy xem xét sau một trong các giải pháp mà tôi đã mô tả. –

Trả lời

10

Is it possible to change the border color of a toolstrip menu dropdown list.

Yes. Một lớp học mà được thừa hưởng từ ProfessionalColorTable tác phẩm như mong đợi:

class MenuColorTable : ProfessionalColorTable 
{ 
    public MenuColorTable() 
    { 
     // see notes 
     base.UseSystemColors = false; 
    } 
    public override System.Drawing.Color MenuBorder 
    { 
     get{return Color.Fuchsia;} 
    } 
    public override System.Drawing.Color MenuItemBorder 
    { 
     get{return Color.DarkViolet;} 
    } 
    public override Color MenuItemSelected 
    { 
     get { return Color.Cornsilk;} 
    } 
    public override Color MenuItemSelectedGradientBegin 
    { 
     get{return Color.LawnGreen;} 
    } 
    public override Color MenuItemSelectedGradientEnd 
    { 
     get { return Color.MediumSeaGreen; } 
    } 
    public override Color MenuStripGradientBegin 
    { 
     get { return Color.AliceBlue; } 
    } 
    public override Color MenuStripGradientEnd 
    { 
     get { return Color.DodgerBlue; } 
    } 
} 

Ở dạng tải:

menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable()); 

Nếu visual styles không bật, không phải tất cả các mục bảng màu sẽ được sử dụng và một số SystemColors sẽ được sử dụng thay thế. Bạn kích hoạt visual styles trong Main():

// must be done before any UI elements are used 
Application.EnableVisualStyles(); 

Bạn có thể muốn cũng vô hiệu hóa hệ thống màu sắc như trong ctor. Giá trị mặc định sẽ là false cho dù kiểu trực quan có được bật hay không, nhưng có thể một số thứ khác đã thay đổi nó?

base.UseSystemColors = false; 

Cả EnableVisualStyles()UseSystemColors = false; phải tại chỗ cho tất cả các yếu tố đang hiển thị trong bảng màu của bạn sẽ được thực hiện, nếu không chỉ có một số được sử dụng. (Mặc dù, MenuBorder dường như làm việc không có vấn đề gì.) Nếu không, kết quả như mong đợi:

enter image description here

Gradient đơn đi từ AliceBlue để DodgerBlue; một mục bằng chuột trên nó sử dụng một gradient từ trên xuống dưới của LawnGreen đến MediumSeaGreen (chuột không được hiển thị).

enter image description here

Khi mở, biên giới đơn là Fuschia (mmmm, nhẹ nhàng!)

enter image description here

Với chuột lên một trong các mục (chuột không hiển thị), mục sử dụng MenuItemSelected màu là Consilk.

Nếu bạn gặp khó khăn khi ghi đè công việc của mình, hãy kiểm tra xem bạn có đang sử dụng đúng hay không (nghĩa là tên của chúng ngụ ý, một số thì gây hiểu lầm lúc đầu).

Bạn cũng có thể kiểm tra xem bạn đang sử dụng một MenuStrip cho trình đơn không, Net có lớp trình đơn cũ hơn khác mặc dù bạn phải tìm kiếm để tìm nó. Bạn cũng có thể thay đổi hoặc vô hiệu hóa bất kỳ Chủ đề nào để xem điều đó có thể gây ra các hiệu ứng bất lợi hay không.

+0

Cảm ơn - đó là câu trả lời hay. Bất kỳ ý tưởng nào là phương pháp ghi đè để thay đổi màu phông chữ của mục menu đã chọn (menu trên cùng, không thả xuống)? –

+0

Isnt chỉ là một tài sản tiêu chuẩn? 'menuStrip1.BackColor' nó dường như chỉ thay đổi văn bản menu Top/Main. Ngoài ra còn có MouseEnter/MouseLeave sự kiện nếu bạn muốn sych một số thay đổi để thi đua hiệu ứng Glow. Đó có thể là tẻ nhạt mặc dù – Plutonix

0

Tôi không thể làm cho các ứng dụng demo ngay bây giờ, nhưng ảnh chụp màn hình trong bài viết này http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-including-common-presets chứng tỏ chúng ta biết rằng thay đổi về màu sắc biên giới là có thể.

Anh chàng đó đã phát triển một số thư viện nhưng dựa trên việc triển khai ToolStrip chuẩn.

Tôi hy vọng liên kết này sẽ hữu ích.

+0

Tx, không chắc chắn nếu tôi đang thiếu một cái gì đó, nhưng biên giới trong những ảnh chụp màn hình vẫn còn màu trắng (cho trình đơn thả xuống). –

+0

Cửa sổ này: http://i48.tinypic.com/2mzjfva.jpg có đường viền tối màu đỏ. Một số biên giới trắng thêm là do nền. –

+0

Đó là viền trắng bổ sung mà tôi đang đề cập đến. Trên ảnh chụp màn hình của tôi, tôi cũng có nền màu khác nhau (theo ảnh chụp màn hình được tham chiếu của bạn). Nhưng cả hai đều có viền trắng nhỏ vui nhộn. –

0

Bạn có thể cung cấp cho các mục tiêu cực lề để che phủ biên giới.

6

Để thay đổi màu đường viền, nó đủ để làm theo giải pháp Plutonix được mô tả trong câu trả lời được chấp nhận. Nhưng để loại bỏ đường viền màu trắng giữa các mục và menu biên giới, bạn nên làm theo một trong các giải pháp:

Giải pháp 1


Bạn có thể làm điều đó bằng cách thực hiện bảng màu tùy chỉnh của bạn mà được thừa hưởng ProfessionalColorTable và trọng đúng thuộc tính. Để làm như vậy, hãy làm theo các bước sau:

bước

  1. Đặt một toolstrip vào mẫu của bạn và thêm DropDownButton và các mặt hàng phụ của nó với nó, và Set ForeColor các hạng mục phụ sang màu trắng.
  2. Tạo một lớp CustomColorTable Thừa hưởng từ ProfessionalColorTable
  3. Override ImageMarginGradientBegin, ImageMarginGradientMiddle, ImageMarginGradientEnd, ToolStripDropDownBackground và trả lại màu sắc mà bạn muốn (màu xanh) .Từ
  4. Trong trường hợp Form tải của bạn thiết lập tài sản của ToolStripManager Renderer sử dụng một ToolStripProfessionalRenderer rằng sử dụng CustomColorTable của bạn.

CustomColorTable Mã

public class CustomColorTable:ProfessionalColorTable 
{ 
    public override Color ImageMarginGradientBegin 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ImageMarginGradientMiddle 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ImageMarginGradientEnd 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ToolStripDropDownBackground 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 
} 

Form tải Mã

private void Form_Load(object sender, EventArgs e) 
{ 
    ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); 
} 

Ảnh chụp màn hình

Dưới đây là bình thường screenshot

enter image description here

Và đây là một ảnh chụp màn hình 2x phóng đại:

enter image description here

Giải pháp 2


Ngoài ra còn có một giải pháp thay thế đó là áp dụng nếu bạn không muốn để sử dụng hình ảnh trong các mục menu của bạn. Trong trường hợp này, hãy tìm thuộc tính DropDown của dropdownbutton của bạn và đưa nó vào ToolStripDropDownMenu, sau đó thiết lập thuộc tính ShowImageMargin của nó thành false và BackColor của nó thành màu bạn muốn (màu xanh).

private void Form_Load(object sender, EventArgs e) 
{ 
    //The item with text "My Menu" in your sample 
    var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown; 
    dropDownMenu.ShowImageMargin = false; 
    dropDownMenu.BackColor = Color.Navy; 
} 

enter image description here

+0

Cảm ơn câu trả lời. Nó cũng là một câu trả lời hay, nhưng tôi đã thấy câu trả lời dưới đây trước và đã thực hiện toàn bộ. Đáng buồn là tôi chỉ có thể chấp nhận 1 câu trả lời. –

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