2015-01-25 6 views
2

Как добавить дополнительный параметр строки в Dispatchertimer Eventhandler?.Добавить дополнительный параметр строки в DispatcherTimer EventHandler

Я хотел бы добиться чего-то вроде этого:

string ObjectName = "SomeObjectName"; 
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick(ObjectName)); 

И функция:

private void dispatcherTimer_Tick(object sender, EventArgs e, string ObjectName) 
{ 
    [...] 
} 

Как я могу добиться этого?

Edit:

Мое намерение добавить анимацию для перемещения объекта. У меня есть холст с несколькими объектами. Я могу переместить эти объекты на холст щелчком мыши, я хотел бы добавить анимацию для этого движения.

+0

Что вы размещаете в .NET 4 –

+1

@GaneshR. Если 'dispatcherTimer_Tick' была функцией, фактически возвращающей« EventHandler »(которой она не является), она никогда не сможет скомпилировать. – Chris

+0

@Chris Yup. Я создал метод dispatcherTimer_Tick, используя ReSharper, который возвратил EventHandler –

ответ

6

Вы можете использовать закрытия для этого:

... 
{  
    string objectName = "SomeObjectName"; 
    var dispatcherTimer = new DispatcherTimer(); 

    dispatcherTimer.Tick += (sender, e) => { myTick(sender, e, objectName); }; 
} 

private void myTick(object sender, EventArgs e, string objectName) 
{ 
    [...] 
} 

Заметим, однако, что переменнаяobjectName захватывается, а не его текущее значение. Это означает, что если вы сделаете это:

... 
{  
    string objectName = "SomeObjectName"; 
    var dispatcherTimer = new DispatcherTimer(); 

    dispatcherTimer.Tick += (sender, e) => { myTick(sender, e, objectName); }; 
    objectName = "SomeOtherObjectName"; 
} 

myTick будет вызываться с SomeOtherObjectName, что может быть нелогичным на первый взгляд. Причиной этого является то, что под капотом создается отдельный экземпляр объекта с полем objectName - очень похожим на то, что делает явно Chris' solution.

+0

Это довольно аккуратно. – Chris

+0

@Chris: Это в основном неявный вариант того, что вы делаете явно. – Heinzi

+0

Да, просто жаль, что я не подумал об этом до моего решения. – Chris

1

Вы можете использовать этот трюк, чтобы пройти как можно больше данных, как вы хотите:

class Foo 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
    // ... 

    public void OnTick(object sender, EventArgs e) 
    { 
     // logic here 
    } 
} 

var f = new Foo() { PropertyA = "some stuff here", 
        PropertyB = "some more stuff here" }; 
dispatcherTimer.Tick += f.OnTick; 

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

Смежные вопросы