C# 用户生成的标签,可以选择并更改其属性

C# User generated Label, that can be selected and its properties changed

我正在尝试开发一种软​​件,用于为学校等设计和生成批量 ID。在设计部分,用户将能够创建任意数量的文本字段,select 它们,拖动它们around and/or 用箭头键轻推它们并编辑它们的属性,如文本、字体、大小和位置。我想要实现的是 Visual Studio 表单设计器的更简单版本。 Here is a screenshot of my UI

到目前为止,我已经创建了一个名为 'UserLabel' 的用户控件,它继承了标签 class(我喜欢标签,因为我可以将背景设置为透明)。单击 'Add Text' 按钮可创建新的 UserLabel,并可在图片框周围拖动。

public partial class UserLabel : Label
{
    private System.Drawing.Point StartPoint;
    private bool IsMouseDown = false;

    public UserLabel()
    {
        InitializeComponent();
        this.Text = "New Item";
        this.AutoSize = true;
        this.BackColor = System.Drawing.Color.Transparent;
        this.Font = new System.Drawing.Font("Arial", 12);
        this.Location = new System.Drawing.Point(5, 5);
        this.Size = new System.Drawing.Size(50, 20);
    }

    protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            IsMouseDown = true;
            this.BringToFront();
            StartPoint = e.Location;
        }
    }

    protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
    {
        IsMouseDown = false;
    }

    protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
    {
        if (IsMouseDown)
        {
            this.Left = e.X + this.Left - StartPoint.X;
            this.Top = e.Y + this.Top - StartPoint.Y;
        }
    }
}

但是由于 Label 不 selectable,我不知道如何从这里开始。当项目被 selected(见下文)时,我尝试添加 BorderStyle 以向用户提供视觉提示哪个项目被 selected。但是,就能够编辑属性而言,这并没有实现任何目标。而且我什至无法删除 BorderSyle 以指示失去焦点。

protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        IsMouseDown = true;
        this.BringToFront();
        StartPoint = e.Location;
        this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
    }
}

任何人都可以指出我如何覆盖 CanFocus 属性(或 Selectable 属性,我不知道)的正确方向或关于如何实现此目标的任何其他建议?我也愿意接受任何其他方法来实现我的目标。

注意:我尝试了一种不同的方法,其中有一定数量的项目被隐藏并且可以被用户设置为可见 like this。但我不喜欢这个,因为它是重复的,即使 10 项看起来很多,我永远不知道用户是否需要更多。

您不必 hide/show 任何静态行数,这是一个糟糕的设计选择。您只需要使用 DataGridView 和 Button 将行添加到 DataGridView。通过这种方式,用户可以在您的文本框中输入他们想要的任何内容,并从行的组合框中 select 选择他们想要的任何内容,还可以使用提交按钮将代码推送到 db/render 它在 ui 上的任何地方你想要。示例代码可能如下所示-

        private void button1_Click(object sender, EventArgs e)
    {
        DataGridViewColumn dataGridViewColumn = new DataGridViewColumn(new DataGridViewTextBoxCell()) ;
        this.dataGridView1.Columns.Add(dataGridViewColumn);
        DataGridViewColumn dataGridViewColumn2 = new DataGridViewColumn(new DataGridViewComboBoxCell());
        this.dataGridView1.Columns.Add(dataGridViewColumn2);
        
        DataGridViewRow dataGridViewRow = new DataGridViewRow();
        dataGridViewRow.Cells.Add(new DataGridViewTextBoxCell());
        this.dataGridView1.Rows.Add(new DataGridViewRow());
    }