我有一个“画布”(只是一个面板控件),用户可以单击一个按钮以将某些控件添加到画布上,例如标签,链接标签,图像等。然后他们可以编辑这些控件,就像它们可以编辑刚刚添加的标签的文本...

但是我试图让他们为他们单击的控件选择一种新的字体和一种新的颜色,但这并不总是可行的,即使它应该...

我的代码是:

private string SelectedControl;


当我单击控件时:

private void label_Click(object sender, EventArgs e)
{
    Label label = (Label)sender;
    SelectedControl = label.Name;
}


当用户选择字体时:

private void setfont()
{
    foreach(Control control in Canvas.Controls)
    {
        if(control.Name == SelectedControl)
        {
            control.Font = selectedfont;
        }
    }
}


因此,此代码确实并非总是有效。是否有人知道以其他方式跟踪“ Last-Clicked”控件,以便以后引用?

最佳答案

为什么不存储对最后单击的控件本身的引用,而不是存储字符串名称?

因此您的代码变为:

private Control SelectedControl;

private void label_Click(object sender, EventArgs e)
{
    Control ctrl = sender as Control;
    if(ctrl != null)
        SelectedControl = ctrl;
}

private void setfont()
{
    SelectedControl.Font = selectedfont;
}


存储参考的成本非常低,您可以直接访问参考。

编辑:通过将引用更改为一个控件,您可以引用许多不同类型的控件,而不必四处打字。
我这样做的原因是:

Control ctrl = sender as Control;
if(ctrl != null)
        SelectedControl = ctrl;


是更安全的打字机吗?如果发件人由于某种原因未从Control继承,则不会进行类型转换,并且label将为null,但不会引发异常。

您可以为希望通过选择被更改的所有控件提供一个单击事件处理程序。如果您要在代码中创建控件并手动挂接事件,这将更加容易。

您可能需要研究做一些边框或效果以显示已选择了哪个控件。
这可以通过执行以下操作来执行:

if(ctrl != null)
{
    Deselect(SelectedControl); //Deselects the old control
    SelectedControl = ctrl;
    Select(SelectedControl); //Selects the new control
}


在其中取消选择和选择会产生一些奇特的效果或边框。

希望这可以帮助。

10-07 19:01
查看更多