2

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

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

我的代码是:

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 控件的任何其他方法,以便以后可以引用它?

4

1 回答 1

3

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

所以你的代码变成:

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
}

其中 Deselect 和 Select 做一些花哨的效果或边框。

希望这可以帮助。

于 2009-10-07T12:25:34.203 回答