wpf自定义创建图例1(分段式)

本文介绍如何在WPF项目中自定义创建分段式图例,通过前端添加控件实现,详细讲解了wpf窗体的样式设置代码及后台处理,包括使用colorSetSky类来设置颜色区间。

项目中用到使用wpf创建多个图图例,通过前端添加控件需制作多个,于是自己写了个两个通用的图例,本例为分段式图例,即一个区间赋一个颜色,渐变色图例见wpf自定义创建图例2(渐变式)


wpf窗体设置样式代码:

<Window x:Class="wpfTest.ColorLegend"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ColorLegend" Height="326" Width="168" Opacity="0.8"
        AllowsTransparency="True" Topmost="True" WindowStyle="None" Background="{x:Null}"
        AllowDrop="True" MouseLeftButtonDown="DragWindow" Closed="Window_Closed">
    <Window.Resources>
        <Style x:Key="lab_Style" TargetType="Label">
            <Setter Property="Foreground" Value="White"></Setter>
            <Setter Property="HorizontalAlignment" Value="Left"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="Height" Value="25"></Setter>
            <Setter Property="Width" Value="70"></Setter>
        </Style>
        <Style x:Key="title_Style" TargetType="Label">
            <Setter Property="Foreground" Value="White"></Setter>
            <Setter Property="FontWeight" Value="Bold"></Setter>
            <Setter Property="FontSize" Value="12"></Setter>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="Height" Value="25"></Setter>
            <Setter Property="Width" Value="70"></Setter>
        </Style>


        <Style x:Key="rec_Style" TargetType="Rectangle">
            <Setter Property="Height" Value="15"></Setter>
            <Setter Property="Width" Value="40"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="HorizontalAlignment" Value="Right"></Setter>
        </Style>
    </Window.Resources>
</Window>


后台代码:

 /// <summary>
    /// ColorLegend.xaml 的交互逻辑
    /// </summary>
    public partial class ColorLegend : Window
    {
        public ColorLegend(List<ColorValueSKY> colorSet, string title)
        {
            InitializeComponent();


            SolidColorBrush brush = new SolidColorBrush(Colors.Black);
            this.Background = brush;


            this.Height = colorSet.Count * 22;
            this.Width = 120;


            this.CreateLegend(colorSet, title);
        }


        public void CreateLegend(List<ColorValueSKY> colorSet, string title)
        {
            Grid grid = new Grid();
            RowDefinition row0 = new RowDefinition();
            row0.Height = new GridLength(22);
            grid.RowDefinitions.Add(row0);


            for (int i = 0; i < colorSet.Count; i++)
            {
                RowDefinition row = new RowDefinition();
                row.Height = new GridLength(20);// GridLength.Auto;
                grid.RowDefinitions.Add(row);




                ColumnDefinition column0 = new ColumnDefinition();
                column0.Width = new GridLength(50);// GridLength.Auto;
                grid.ColumnDefinitions.Add(column0);


                ColumnDefinition column1 = new ColumnDefinition();
                column1.Width = new GridLength(70);// GridLength.Auto;
                grid.ColumnDefinitions.Add(column1);


                for (int j = 0; j < 2; j++)
                {
                    Rectangle rectangle = new Rectangle();
                    rectangle.Style = (Style)this.FindResource("rec_Style");
                    rectangle.Fill = new SolidColorBrush(Color.FromArgb((byte)colorSet[i].Alpha, (byte)colorSet[i].R, (byte)colorSet[i].G, (byte)colorSet[i].B));


                    grid.Children.Add(rectangle);
                    Grid.SetRow(rectangle, i + 1);
                    Grid.SetColumn(rectangle, 0);


                    Label lab = new Label();
                    lab.Style = (Style)this.FindResource("lab_Style");
                    lab.Content = colorSet[i].Name;


                    grid.Children.Add(lab);
                    Grid.SetRow(lab, i + 1);
                    Grid.SetColumn(lab, 1);
                }
            }


            Label labT = new Label();
            labT.Style = (Style)this.FindResource("title_Style");
            labT.Content = title;


            grid.Children.Add(labT);
            Grid.SetRow(labT, 0);
            Grid.SetColumn(labT, 0);
            Grid.SetColumnSpan(labT, 2);


            this.Content = grid;
        }


        public void DragWindow(object sender, MouseButtonEventArgs args)
        {
            this.DragMove();
        }


        private void Window_Closed(object sender, EventArgs e)
        {
            this.Close();
        }
        
    }


colorSetSky类:

 /// <summary>
    /// 自定义颜色集
    /// </summary>
    public class ColorSetSKY
    {
        private List<ColorValueSKY> m_ColorSkyList=null;

        public string Name="";

        public List<ColorValueSKY> ColorSkyList
        {
            get { return this.m_ColorSkyList; }
            set { this.m_ColorSkyList = value; }
        }

        public ColorSetSKY()
        {
            m_ColorSkyList = new List<ColorValueSKY>();
        }

        /// <summary>
        /// 根据指定数值返回颜色
        /// </summary>
        /// <param name="currentValue"></param>
        /// <returns></returns>
        public ColorValueSKY GetPresetColor(float currentValue)
        {
            ColorValueSKY curColor = null;
            foreach (ColorValueSKY colorValue in m_ColorSkyList)
            {
                if (currentValue <= colorValue.MaxValue && currentValue > colorValue.MinValue)
                {
                    curColor= colorValue;
                }
            }
            return curColor;
        }

        ///// <summary>
        ///// 返回指定值对应的颜色ARGB值
        ///// </summary>
        ///// <param name="currentValue"></param>
        ///// <returns></returns>
        //public int GetPresetColorArgb(float currentValue)
        //{
        //    foreach (ColorValue colorValue in m_ColorValueSet)
        //    {
        //        if (colorValue.ValueInScope(currentValue))
        //        {
        //            return colorValue.CurrentColorValue;
        //        }
        //    }
        //    return Color.Transparent.ToArgb();
        //}


    }

    /// <summary>
    /// 颜色图例
    /// </summary>
    public class ColorValueSKY
    {
        /// <summary>
        /// 红色 0-255
        /// </summary>
        public int R;

        /// <summary>
        /// 绿色 0-255
        /// </summary>
        public int G;

        /// <summary>
        /// 蓝色 0-255
        /// </summary>
        public int B;

        /// <summary>
        /// 透明度 0-255
        /// </summary>
        public int Alpha;

        /// <summary>
        /// 最小值
        /// </summary>
        public double MinValue;

        /// <summary>
        /// 最大值
        /// </summary>
        public double MaxValue;

        /// <summary>
        /// 显示文字
        /// </summary>
        public string Name;

        /// <summary>
        /// 颜色图例
        /// </summary>
        /// <param name="r">红</param>
        /// <param name="g">绿</param>
        /// <param name="b">蓝</param>
        /// <param name="alpha">透明度</param>
        /// <param name="min">最小值</param>
        /// <param name="max">最大值</param>
        /// <param name="name">名称</param>
        public ColorValueSKY(int r, int g, int b, int alpha, double min, double max, string name)
        {
            this.R = r;
            this.G = g;
            this.B = b;
            this.Alpha = alpha;
            this.MinValue = min;
            this.MaxValue = max;
            this.Name = name;
        }
    }


效果图:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值