c#下拉颜色框

C#自定义控件一下拉颜色框

效果图:

通过继承ComboBox可以设计出类似C#控件属性栏中的颜色下拉选择框。

添加组件命名为myColorComboBox.cs

 

第一步:继承ComboBoxpublic partial class myColorComboBox : ComboBox

 

第二步:构造下拉颜色选择框

private void InitItems()

        {

            this.DrawMode = DrawMode.OwnerDrawFixed;//手动绘制所有元素

            this.DropDownStyle = ComboBoxStyle.DropDownList;//下拉框样式设置为不能编辑

            this.Items.Clear();//清空原有项

            Array allColors = Enum.GetValues(typeof(KnownColor));//获取系统颜色名存入列表

            foreach (KnownColor var in allColors)

            {

                this.Items.Add(var.ToString()); //加载该选项框的子项

            }

            this.SelectedIndex = 0;

        }

在两个构造函数中加入InitItems()

 

第三步:重写OnDrawItem方法

protected override void OnDrawItem(DrawItemEventArgs e)

        {

            if (e.Index >= 0)//判断是否需要重绘

            {

                string colorName = this.Items[e.Index].ToString();//获取颜色名

                SolidBrush brush = new SolidBrush(Color.FromName(colorName));//定义画刷

                Font font = new Font("宋体", 9);//定义字体

                Rectangle rect = e.Bounds;

                rect.Inflate(-2, -2);

 

                Rectangle rectColor = new Rectangle(rect.Location, new Size(20, rect.Height));

                e.Graphics.FillRectangle(brush, rectColor);//填充颜色

                e.Graphics.DrawRectangle(Pens.Black, rectColor);//绘制边框

                e.Graphics.DrawString(colorName, font, Brushes.Black, (rect.X + 22), rect.Y);//绘制文字

            }

        }

 

第四步:增加控件属性

 

/// <summary>

        /// 选择的颜色名称

        /// </summary>

        public string SelectColorName

        {

            get { return this.Text; }

        }

 

        /// <summary>

        /// 选择的颜色

        /// </summary>

        public Color SelectColor

        {

            get { return Color.FromName(this.Text); }

        }

 

用法:

直接从控件栏中找到自定义控件myColorComboBox,拖过去自动命名为myColorCombBox1,可以通过myColorCombBox1.SelectColor获取颜色,类型为Color,通过myColorCombBox1.SelectColorName获取用户选定的颜色名。

 

下面贴出全部代码:

//控件名:myColorComboBox

//作者:刘典武

//时间:2011-06-01

 

using System;

using System.ComponentModel;

using System.Collections.Generic;

using System.Diagnostics;

using System.Text;

using System.Windows.Forms;

using System.Drawing;

 

namespace myControl

{

    public partial class myColorComboBox : ComboBox

    {

        public myColorComboBox()

        {

            InitializeComponent();

            InitItems();

        }

 

        public myColorComboBox(IContainer container)

        {

            container.Add(this);

 

            InitializeComponent();

            InitItems();

        }

 

        private void InitItems()

        {

            this.DrawMode = DrawMode.OwnerDrawFixed;//手动绘制所有元素

            this.DropDownStyle = ComboBoxStyle.DropDownList;//下拉框样式设置为不能编辑

            this.Items.Clear();//清空原有项

            Array allColors = Enum.GetValues(typeof(KnownColor));//获取系统颜色名存入列表

            foreach (KnownColor var in allColors)

            {

                this.Items.Add(var.ToString()); //加载该选项框的子项

            }

            this.SelectedIndex = 0;

        }

 

        protected override void OnDrawItem(DrawItemEventArgs e)

        {

            if (e.Index >= 0)//判断是否需要重绘

            {

                string colorName = this.Items[e.Index].ToString();//获取颜色名

                SolidBrush brush = new SolidBrush(Color.FromName(colorName));//定义画刷

                Font font = new Font("宋体", 9);//定义字体

                Rectangle rect = e.Bounds;

                rect.Inflate(-2, -2);

 

                Rectangle rectColor = new Rectangle(rect.Location, new Size(20, rect.Height));

                e.Graphics.FillRectangle(brush, rectColor);//填充颜色

                e.Graphics.DrawRectangle(Pens.Black, rectColor);//绘制边框

                e.Graphics.DrawString(colorName, font, Brushes.Black, (rect.X + 22), rect.Y);//绘制文字

            }

        }

 

        /// <summary>

        /// 选择的颜色名称

        /// </summary>

        public string SelectColorName

        {

            get { return this.Text; }

        }

 

        /// <summary>

        /// 选择的颜色

        /// </summary>

        public Color SelectColor

        {

            get { return Color.FromName(this.Text); }

        }

    }

}

 

C#中,如果你想要为ComboBox(组合)的下拉项添加颜色,你可以通过自定义数据模板、样式或者程序逻辑来实现。这里提供一种简单的例子,我们将使用`DataTemplate`来改变每个项目的颜色: 1. 首先,创建一个新的`ResourceDictionary`,并为其指定XAML文件,例如`MyColors.xaml`: ```xml <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Style TargetType="{x:Type ComboBoxItem}"> <Setter Property="Foreground" Value="{Binding Path=YourValueProperty, Converter={StaticResource ColorConverter}}"/> </Style> <local:ColorConverter x:Key="ColorConverter"> <!-- 这里需要你自己定义一个ColorConverter --> <!-- 使用某个规则将绑定的值转换为颜色 --> <local:ColorConverter.ValueToStringConverter> <lambda:ValueConverterMarkupExtension> <lambda:Converters.ColorFromEnumConverter /> </lambda:ValueConverterMarkupExtension> </local:ColorConverter.ValueToStringConverter> </local:ColorConverter> </ResourceDictionary> ``` 在这里,`YourValueProperty`应该替换为你实际使用的属性名,用于确定每个项的颜色。`ColorConverter`是一个自定义转换器,它接收`YourValueProperty`的值,并将其转换为对应的颜色。 2. 然后,在你的窗体或ViewModel中加载这个资源: ```csharp public partial class YourWindow : Window { public YourWindow() { InitializeComponent(); this.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("pack://application:,,,/Resources/MyColors.xaml", UriKind.Relative) }); } } ``` 3. 最后,在设置ComboBox的数据源时,你需要确保`YourValueProperty`已关联到每个项目的一个颜色枚举或其他可以转换为颜色的值: ```csharp comboBox.ItemsSource = Enum.GetValues(typeof(YourColorEnum)); ``` 其中`YourColorEnum`是你定义的颜色枚举类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值