Универсальные типы: нет неявного преобразования ссылок из ToolStripStatusLabel в Control - PullRequest
3 голосов
/ 12 мая 2011

Я хочу обновить пользовательский интерфейс из обработчика событий SerialPort DataReceived.Я обнаружил проблему, потому что обработчик событий неявно выполнялся в другом потоке формы, а не просто обновлял пользовательский интерфейс ...

myLabel.Text = "Some text";

... Мне пришлось использовать следующий подход:

    InvokeControlAction<Label>(myLabel, lbl=> lbl.Text= "Some text");
...
    public static void InvokeControlAction<t>(t cont, Action<t> action) where t : Control
    {
        if (cont.InvokeRequired)
        {
            cont.Invoke(new Action<t, Action<t>>(InvokeControlAction),
                          new object[] { cont, action });
        }
        else
        { 
            action(cont); 
        }
    }

Пока все хорошо ... Однако теперь я хочу обновить ToolStripStatusLabel - использование того же подхода приводит к ошибке «неявного преобразования ссылок между ToolStripStatusLabel и Forms.Control».

Из того, что я прочитал, проблемы связаны с тем, что вы не можете вызвать ToolStripStatusLabel.

Итак, как мне лучше всего справиться с этим?

Примечание: делегаты и т. Д. Находятся на пороге моей нынешней способности, поэтому было бы полезно получить объяснение наряду с решением.

ОБНОВЛЕНИЕ 1: Просто чтобы прояснить, япопытался создать ToolStripStatusLabel, эквивалентный InvokeControlAction, но это не сработает, потому что у него нет метода invoke.

RESULT : после пересмотра моего решения я реализовал его какМетод расширения, как первоначально предложил Джимми.

Я создал статический класс ExtensionMethod (в своем собственном пространстве имен 'ExtensionMethods'), добавленный в метод InvokeOnToolStripItem, добавив 'using ExtensionMethods;'директива в моем исходном классе и вызывал методы следующим образом:

tsStatusValue.InvokeOnToolStripItem(ts => ts.Text = "ALARM signal received");

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

<a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripstatuslabel.aspx" rel="nofollow">ToolStripStatusLabel</a> не наследуется от Control, и поэтому ваше общее ограничение не выполняется по точной причине, которую вы опубликовали.

Более того, ToolStripStatusLabel (или любой ToolStripItem на самом деле)не имеет Invoke метода.К счастью, содержит ToolStrip, который легко доступен с помощью метода <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.toolstripitem.getcurrentparent.aspx" rel="nofollow">GetCurrentParent</a>.

Вот метод расширения, который работает на любом ToolStripItem:

public static void InvokeOnToolStripItem<T>(this T item, Action<T> action)
    where T : ToolStripItem
{
    ToolStrip parent = item.GetCurrentParent();
    if (parent.InvokeRequired)
    {
        parent.Invoke((Delegate)action, new object[] { item });
    }
    else
    {
        action(item);
    }
}

Вы можете использовать его, просто вызвав:

myToolStripLabel.InvokeOnToolStripItem(label => label.Text = "Updated!");
myToolStripProgressBar.InvokeOnToolStripItem(bar => bar.PerformStep());
0 голосов
/ 12 мая 2011

Чтобы объяснить сообщение об ошибке, вы написали

where t : Control

но ToolStripStatusLabel не наследуется от Control.

Не уверен, поможет ли это вам вообще и пока нет решения: (

...