在OnDraw事件中创建的动态标签,可在Visual Studio Designer中编辑

时间:2019-06-28 16:51:09

标签: c# .net winforms user-controls windows-forms-designer

关于UserControl,一个人如何创建一个动态数字(可通过Visual Studio编辑的属性编号)的标签,其文本可以通过Visual Studio“设计”窗口进行编辑?

编辑 为了澄清,我不希望用户在运行时更改标签文本,而只希望通过在项目中使用控件,只需单击标签并更改文本,即可在 Visual Studio Designer 中更改标签的文本。 (不是源代码本身)。

就我所拥有的而言,当我在OnDraw事件的替代中添加动态标签时,可以在设计窗口中看到但不能编辑标签。

为了使我的问题更加清楚,我提供了一个示例情况来演示该问题。具体来说,我正在Draw事件内创建一定数量的标签,如下面的代码。标签的数量及其位置将取决于要绘制的标签数量,该数量是通过控件中可公开访问的属性提供的。

    public void CalledFromDrawMethod (string strElement, UserControl ucParentControl, Point pLoc)
    {
        var lblChild = new Label();
        lblChild.Text = strElement;
        lblChild.Location = pLoc;
        ucParentControl.Controls.Add(lblChild);// Add the label
    }

下面是Visual Studio中“设计”窗口视图中表单中的用户控件。一幅图片是当绘制6个标签时的用户控件,第二幅图片是当绘制3个标签时的用户控件。再次,此数量的标签由控件中的公共可访问属性指定

enter image description here  enter image description here

在图片中描绘的特定情况下,我希望能够单击“默认”标签之一并更改标签的“文本”属性。

Visual Studio版本::VS 2013(我也尝试使用VS 15和17,但得到了相同的结果) GUI框架: Winforms

4 个答案:

答案 0 :(得分:3)

您可以使用行为服务。 Here是MS的文章。由于实施起来非常困难,我建议您以StringCollectionEditor为代价。

答案 1 :(得分:1)

这是使用自定义控件的非常基本的示例。

public class ExampleCustomControl : Control
{
    public string Title { get; set; } = "";

    [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]
    public StringCollection SomeValues { get; set; } = new StringCollection();
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // grab the graphics object
        var g = e.Graphics;

        // draw the title property
        g.DrawString(Title, Font, Brushes.Blue, 0, 0);

        // will alter positions
        var y = 10;

        // for each value set in the properties
        foreach (var value in SomeValues)
        {
            // draw the property value
            g.DrawString(value, Font, Brushes.Red, 0, y);

            // move the position for the next text
            y += 10;
        }
    }
} 

该控件具有2个属性,TitleSomeValues,如果您以此构建应用程序,则可以将该控件拖放到任何表单上。然后只需单击控件并检查属性网格,您将看到TitleSomeValues,您可以在设计时在此处进行编辑。显然,它只是在重绘时进行更新,因此只需移动它,拉伸它或关闭表单并重新打开以使其显示即可。

您可以在设计时进行任何更改,也可以在运行时进行更改,这样就不必强迫您总是这样做。如果您要更改其他文本(因为它是一个属性),也可以根据需要通过代码进行更改。

答案 2 :(得分:1)

您的问题的答案是不可能实现您想要的。

在Visual Studio中根本无法获得您想要的东西。如果有可能,那么应该有一些具有此行为的.NET控件,但没有。尽管在OnDraw事件中创建的标签的行为就像将标签放在Designer中的窗体上一样会很好,但是必须在Visual Studio中添加额外的支持。如上一个答案所述,最好的解决方法是拥有一个可以在Visual Studio设计器中修改这些标签的文本的集合。

答案 3 :(得分:0)

您需要开发UserControlDesigner。所有现代UI工具包都具有某种形式。我公司使用DevExpress,而alomst的所有复杂控件都有自己的自定义设计器,仅在设计时可用。

请参阅以下文章作为示例,因为它很容易成为一个复杂的主题。

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/creating-a-wf-control-design-time-features

在stackoverflow中,还有另一个问题可能会对您有所帮助

Custom Designer for a Control