2015-01-08 3 views
0

У меня проблема на данный момент, я использую таймер для анимации, и я хочу иметь возможность решить, с чего начать использовать начальные и конечные целые числа, как я покажу ниже.Передача переменной на timer_tick

private void Button1_Click(object sender, EventArgs e) 
{ 
    AnimateKey(0,100); 
} 

private void AnimateKey(int Start, int Stop) 
{ 
    myTimer.Interval = 5; 
    myTimer.Tick += new EventHandler(myTimer_Tick); 
    myTimer.Enabled = true; 
    myTimer.Start(); 
} 

private void myTimer_Tick(object sender, EventArgs e) 
{ 
    lock (myTimer) 
    { 
     int StartingFrame = Start; 
     int StopFrame = Stop; 
     etc...etc.. 
    } 
} 

Теперь моя проблема заключается в том, что я хочу передать значения 0 и 100 на событие таймера Tick, но я понятия не имею о том, как идти о делать это. Как я могу получить целые числа 0 и 100 от нажатия кнопки до отметки таймера?

+0

информация о магазине в myTimer.Tag – DrKoch

+0

@DrKoch Я не знаю, как добавить несколько тегов в тег. Также это безопасный способ сделать это? – BornToGrill

+0

см. Мой ответ для более полного примера. – DrKoch

ответ

4

Просто используйте лямбда при определении обработчика клещ событий, чтобы закрыть над параметрами, нужно:

private void AnimateKey(int Start, int Stop) 
{ 
    myTimer.Interval = 5; 
    myTimer.Tick += (s, args) => myTimer_Tick(Start, Stop); 
    myTimer.Enabled = true; 
    myTimer.Start(); 
} 

private void myTimer_Tick(int Start, int Stop) 
{ 
    //Do stuff 
} 

отметить также, что Tick событие Timer, который вы используете, будет уволен в UI, так что нет необходимости в lock; код уже синхронизирован.

+0

Действительно простой и чистый, хороший способ решить его с помощью 0 дополнительного кода. Также легко реализовать в другом месте :) спасибо. – BornToGrill

0

использовать класс со всеми деталями:

public class TimerInfo 
{ 
    public int Start; 
    public int Stop; 
} 

магазин экземпляр в категории таймера

myTimer.Tag = new TimerInfo { Start = 0, Stop = 100 }; 

внутри EventHandler Вы получаете доступ этой информации

myTimer = (Timer)sender; 
TimerInfo ti = (TimerInfo)myTimer.Tag; 
+0

Мне сказали, что решение 1 действительно небезопасно, не знаю почему, но мне сказали не использовать его. И хотя решение .Tag работает, я использую его и для других вещей. – BornToGrill

0

довольно трудно понять, что вы имеете в виду, но давайте попробуем. Если вы хотите передать целые числа start и остановиться на функцию TimerTick, вы, вероятно, не понимаете параметр EventArgs. EventArgs - это средство для хранения аргументов, которые имеют отношение к вашему сценарию, - и решение прост.

class myTimerEventArgs:EventArgs // Declaring your own event arguements which you want to send 
{ 
public int start{get;set;} 
public int stop {get;set;} 
/*Constructor, etc...*/ 
} 
... 
//Making the call inside another class: 
myTimer_Tick(this,new myTimerEventArgs(0,100); 

Однако я мог бы вас не понимать; Если речь идет о подсчете тиков, пока он не достигнет 100 тиков (/ интервалов), решение является простой функция добавляется к событию, которые, вероятно, выглядеть следующим образом:

int Count = 0; 
... 
private void Counter(object sender, EventArgs e) 
{ 
Count++; 
} 
... 
private void AnimateKey(int Start, int Stop) 
{ 
    myTimer.Interval = 5; 
    myTimer.Tick += new EventHandler(myTimer_Tick); 
    myTimer.Tick += new EventHandler(Counter); 
    myTimer.Enabled = true; 
    myTimer.Start(); 
    while(Count!=100); 
    myTimer.Stop(); 
} 

Надеюсь, что я помог, иметь хороший день :)

+0

Btw, решение Koch тоже хорошо, мне просто не нравится использование Timer.Tag для этой пурпуры (требуется реализация тега и предотвращает использование тегов других применений) –

+0

Неплохо, что я имел в виду, извините, если я был бит расплывчатый. Я думаю, что предыдущее решение EventArgs, которое у вас было, могло бы работать, хотя я даже не знаю, что делать с EventArgs, глядя на учебные пособия, но все же не понимая.Я в основном хочу, чтобы иметь доступ к Целям запуска и остановки, которые я определяю в Button1_click, и получить к ним доступ в myTimer_Tick. – BornToGrill

+0

Если вы можете отправить их функции, то это может сработать. Это цель eventargs: прочитайте здесь: http://www.codeproject.com/Articles/9355/Creating-advanced-C-custom-events Если вы хотите, чтобы я реализовал конкретное действие, просто подробно расскажите, что вам нужно чтобы увидеть, и я отредактирую ответ с помощью образца кода. –

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