Получение выбранного элемента управления - PullRequest
2 голосов
/ 07 октября 2009

У меня есть «холст» (который является просто элементом управления Panel), и пользователь может нажать кнопку, чтобы добавить определенные элементы управления на холст, например ярлыки, ярлыки ссылок, изображения и т. Д. И затем они смогут редактировать эти элементы как будто они могут редактировать текст только что добавленной метки ...

Но я пытаюсь позволить им выбрать новый шрифт и новый цвет для элемента управления, на который они нажали, но это не всегда работает, даже если это должно быть ...

код, который у меня есть:

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, чтобы на него можно было ссылаться позже?

1 Ответ

3 голосов
/ 07 октября 2009

вместо сохранения имени строки, почему бы не сохранить ссылку на последний элемент управления, по которому последний щелкнул?

так ваш код становится:

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, то он не будет типизированным и метка будет нулевой, но исключение не будет возбуждено.

Вы можете иметь обработчик событий одним щелчком мыши для всех элементов управления, которые вы хотите изменить, выбрав их. Это будет работать намного проще, если вы создаете элементы управления в коде и подключаете события вручную.

Возможно, вы захотите изучить некоторые границы или эффекты, чтобы показать, какой элемент управления был выбран. Это может быть выполнено следующим образом:

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

где Отмена выбора и Выбор делают некоторые необычные эффекты или границу.

Надеюсь, это поможет.

...