关于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个标签时的用户控件。再次,此数量的标签由控件中的公共可访问属性指定
在图片中描绘的特定情况下,我希望能够单击“默认”标签之一并更改标签的“文本”属性。
Visual Studio版本::VS 2013(我也尝试使用VS 15和17,但得到了相同的结果) GUI框架: Winforms
答案 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个属性,Title
和SomeValues
,如果您以此构建应用程序,则可以将该控件拖放到任何表单上。然后只需单击控件并检查属性网格,您将看到Title
和SomeValues
,您可以在设计时在此处进行编辑。显然,它只是在重绘时进行更新,因此只需移动它,拉伸它或关闭表单并重新打开以使其显示即可。
您可以在设计时进行任何更改,也可以在运行时进行更改,这样就不必强迫您总是这样做。如果您要更改其他文本(因为它是一个属性),也可以根据需要通过代码进行更改。
答案 2 :(得分:1)
您的问题的答案是不可能实现您想要的。
在Visual Studio中根本无法获得您想要的东西。如果有可能,那么应该有一些具有此行为的.NET控件,但没有。尽管在OnDraw事件中创建的标签的行为就像将标签放在Designer中的窗体上一样会很好,但是必须在Visual Studio中添加额外的支持。如上一个答案所述,最好的解决方法是拥有一个可以在Visual Studio设计器中修改这些标签的文本的集合。
答案 3 :(得分:0)
您需要开发UserControlDesigner。所有现代UI工具包都具有某种形式。我公司使用DevExpress,而alomst的所有复杂控件都有自己的自定义设计器,仅在设计时可用。
请参阅以下文章作为示例,因为它很容易成为一个复杂的主题。
在stackoverflow中,还有另一个问题可能会对您有所帮助