如何在图表类中使用个性化属性网格

本文关键字:个性化 属性 网格 | 更新日期: 2023-09-27 18:01:29

我正在制作一个绘图程序,我希望用户能够快速有效地自定义他们的图形。我已经创建了一个属性网格,允许他们这样做。我用图表的属性填充了它,但删除了我不希望用户访问的某些元素。例如,我不希望用户能够访问可访问性选项。到目前为止我只有

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        magRadioBox.Checked = true;
        PropertyGrid propertyGrid1 = new PropertyGrid();
        propertyGrid1.CommandsVisibleIfAvailable = true;
        propertyGrid1.Text = "Graph and Plotting Options";
        propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
        this.Controls.Add(propertyGrid1);
    }
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "MY Plot Program";
propertyGrid1.SelectedObject = chart1; 
}
private void button1_Click(object sender, EventArgs e)
 {//some code that is populating my chart(chart1) with data 
 .... //chart1 being filled with data 
 }
private void propertyGrid1_PropertyValueChanged(object s , PropertyValueChangedEventArgs e)
{
//Calling the method that will refresh my chart1 
myChart.Invalidate(); 
}

上面的代码是我的表单。下面的"MyChart"类代码设置了我的属性网格。我可以自动获取图表的所有属性然后通过将其设置为[Browsable(false)]

来"挑选"我不希望用户拥有的属性
namespace FFT_Plotter
{ 
    [DefaultPropertyAttribute("Text")]
    public class MyChart : Chart 
    {
        public event EventHandler PropertyChanged;
private void OnPropertyChanged(object sender, EventArgs e)
{
EventHandler eh = propertyChanged;
if(eh !=null)
{
eh(sender, e);
}
        [BrowsableAttribute(false)]
        public new System.Drawing.Color BackColor
        {
            get { return BackColor; }//Here back color is just an example of a property, not necessarily one that I would make non-Browsable
            set { 
base.BackColor = value; 
OnPropertyChanged(this,EventArgs.Empty);
}
        }
    }
}

上面的类让我到目前为止有一个属性网格,其中包含图表的所有属性,并允许我隐藏这些属性,因为我认为合适。然而,现在我被困在了解如何连接我的chart1到我的属性网格。一个例子是我已经从网格中删除了文本属性。它不再对用户可见。现在我想说改变网格中的BackColor,这意味着我的chart1背面的颜色改变了。

如何在图表类中使用个性化属性网格

好的,我用你的代码做了下面的操作现在改变属性网格中的背景色改变了图表的背景色:

Form1 -

public partial class Form1 : Form
{
    private PropertyGrid propertyGrid1;
    public Form1()
    {
        InitializeComponent();
        //propertyGrid1 = new PropertyGrid();
        propertyGrid1.CommandsVisibleIfAvailable = true;
        propertyGrid1.Text = "Graph and Plotting Options";
        propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
        this.Controls.Add(propertyGrid1);
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        this.Text = "MY Plot Program";
        propertyGrid1.SelectedObject = chart1; 
    }
    private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
    {
        //Calling the method that will refresh my chart1 
        chart1.Invalidate();
    }
}

[DefaultPropertyAttribute("Text")]
public class MyChart : Chart 
{
    public event EventHandler PropertyChanged;
    private void OnPropertyChanged(object sender, EventArgs e)
    {
        if(PropertyChanged !=null)
        {
            PropertyChanged(sender, e);
        }
    }
    [BrowsableAttribute(false)]
    public new string Text { get; set; }

    [BrowsableAttribute(true)]
    public new System.Drawing.Color BackColor
    {
        get { return base.BackColor; }//Here back color is just an example of a property, not necessarily one that I would make non-Browsable
        set 
        { 
            base.BackColor = value; 
            OnPropertyChanged(this,EventArgs.Empty);
        }    
    }     
}
  • 同样,在你的Form1.Designer.cs文件中,你有chart1定义为' system . windows . forms . datavisalization . charts . chart . chart . chart .你需要在它新建的部分将其更改为MyChart(需要搜索chart . chart)