C# 在图例中显示禁用的系列

C# 在图例中显示禁用的系列,c#,winforms,charts,legend,C#,Winforms,Charts,Legend,我有一个复选框,允许我的程序启用图表上显示的禁用序列。当我禁用序列时,它将从图表区域和图例中删除。即使禁用,也可以将其保留在图例中吗?我想更改它在图例中的透明度,使其看起来是禁用的,并将其设置回启用时的全色 以下是我正在寻找的链接: 编辑: 我找到了另一种(更简单的)方法。您只需处理customizeEleGend事件(并使用series.Enabled禁用该系列): 结果: 通过以上扩展的示例,您可以使用MouseMove事件中显示/隐藏的工具提示对象,并在图例应设置动画/更新时触发Cust

我有一个复选框,允许我的程序启用图表上显示的禁用序列。当我禁用序列时,它将从图表区域和图例中删除。即使禁用,也可以将其保留在图例中吗?我想更改它在图例中的透明度,使其看起来是禁用的,并将其设置回启用时的全色

以下是我正在寻找的链接:


编辑:

我找到了另一种(更简单的)方法。您只需处理
customizeEleGend
事件(并使用
series.Enabled
禁用该系列):

结果:


通过以上扩展的示例,您可以使用MouseMove事件中显示/隐藏的工具提示对象,并在图例应设置动画/更新时触发CustomizeEleGend事件。单击图例将隐藏并显示每个系列

private int lastX; private int lastY;
ToolTip tip = new ToolTip();

Chart.MouseMove += (object sender, MouseEventArgs e) =>
{

    //Cancel tooltip re-triggering itself when shown 
    if (e.X == this.lastX && e.Y == this.lastY)
    {
        return;
    }

    //Get any object clicked
    var hit = Chart.HitTest(e.X, e.Y);

    if (hit.Object is LegendItem legendItem)
    {
        tip.Tag = legendItem;
        tip.ToolTipTitle = legendItem.SeriesName;
        tip.Show(legendItem.ToolTip, Chart, new Point(e.X + Chart.Cursor.Size.Width / 2, e.Y + Chart.Cursor.Size.Height / 2));
        Chart.Legends[0].Enabled = true; //trigger CustomizeLegend event
    }
    else
    {
        if (tip.Active)
        {
            tip.UseFading = true;
            tip.Hide(Chart);
            tip.Tag = null;
            Chart.Legends[0].Enabled = true; //trigger CustomizeLegend event
        }
    }

    this.lastX = e.X;
    this.lastY = e.Y;
};
CustomizeElegend事件展开以检查当前legendItem的tooltip.Tag

Chart.CustomizeLegend += (o, e) =>
{

    e.LegendItems.Clear();
    foreach (var series in this.Chart.Series)
    {
        var legendItem = new LegendItem();
        legendItem.Tag = series;
        legendItem.SeriesName = series.Name;
        legendItem.ImageStyle = LegendImageStyle.Rectangle;

        //Check if Tooltip as active for the legend
        if (tip.Tag is LegendItem tipLegendItem && legendItem.SeriesName.Equals(tipLegendItem.SeriesName))
        {
            //Show legend highlighted
            legendItem.ImageStyle = LegendImageStyle.Rectangle;
            legendItem.BorderColor = Color.Black;
            legendItem.BorderWidth = 1;
        }
        else
        {
            //Show legend normal
            legendItem.BorderColor = Color.Transparent;
        }

        legendItem.Name = series.Name + "_legend_item";
        legendItem.ToolTip = "on/off";

        int i = legendItem.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.MiddleCenter);
        legendItem.Cells.Add(LegendCellType.Text, series.Name, ContentAlignment.MiddleLeft);

        //Show legend faint or active by state of Series.Enabled  
        if (series.Enabled) { 
            legendItem.Color = series.Color;
            legendItem.Cells[1].ForeColor = Color.Black;
        }
        else
        {
            legendItem.Color = Color.FromArgb(100, series.Color);
            legendItem.Cells[1].ForeColor = Color.LightGray;
        }

        e.LegendItems.Add(legendItem);
    }
};
和MouseDown事件切换系列。已启用

Chart.MouseDown += (o, e) =>
{
    {
        HitTestResult result = Chart.HitTest(e.X, e.Y);
                    
        // When user hits the LegendItem
        if (result?.Object is LegendItem legendItem)
        {
            if (legendItem.Tag is Series series )
            {
                series.Enabled = !series.Enabled;
                legendItem.ToolTip = series.Enabled ? "Enabled" : "Disabled";
                tip.Show(legendItem.ToolTip, Chart, new Point(e.X + Chart.Cursor.Size.Width / 2, e.Y + Chart.Cursor.Size.Height / 2));
            }
        }
    }
};

您使用的是第三方库吗?当您使用折线图时,将点颜色设置为透明可能会有所帮助,但我用条形图尝试了此示例,将点设置为透明不会显示相同的结果这正是我想要的。谢谢!
Chart.MouseDown += (o, e) =>
{
    {
        HitTestResult result = Chart.HitTest(e.X, e.Y);
                    
        // When user hits the LegendItem
        if (result?.Object is LegendItem legendItem)
        {
            if (legendItem.Tag is Series series )
            {
                series.Enabled = !series.Enabled;
                legendItem.ToolTip = series.Enabled ? "Enabled" : "Disabled";
                tip.Show(legendItem.ToolTip, Chart, new Point(e.X + Chart.Cursor.Size.Width / 2, e.Y + Chart.Cursor.Size.Height / 2));
            }
        }
    }
};