2012-10-09 15 views
5

मैं एक क्रिया को दोहराना चाहता हूं जब Button लंबे समय तक दबाया जाता है, उदाहरण के लिए एमपी 3 रीडर का अगला बटन। WinForm में कोई मौजूदा सी # घटना है?लंबे दबाए गए बटन

मैं एक टाइमर जो क्रिया करने और MouseUp घटना पर यह बंद हो जाएगा शुरू करने के लिए MouseDown घटना संभाल कर सकते हैं, लेकिन मैं इस समस्या को => यानी हल करने के लिए एक आसान तरीका के लिए देख रहा हूँ: एक Timer के बिना एक समाधान (या धागा/कार्य ...)।

उत्तर

0

आप माउसडाउन और माउसअप के बीच टाइमर का उपयोग कर सकते हैं।

MouseDownEvent 

Timer tm1; 

MouseUpEvent 

Timer tm2; 

आप उन्हें आसानी से दो टाइमर के बीच संभाल सकते हैं।

0

बटन दबाए जाने पर आपको कुछ कार्रवाई करने की आवश्यकता होगी, जैसे एमपी 3 ट्रैक में कुछ सेकंड छोड़ना।

माउस पर रद्द होने वाले टाइमर को शुरू करना जो बटन के नीचे होने पर नियमित अंतराल (100ms?) पर उस प्रकार का काम ट्रिगर करता है, मेरे लिए व्यवहार्य लगता है। कार्यान्वित करने में आसान है और यूआई पर अवरुद्ध नहीं है।

एक और आसान समाधान संभवतः यूआई को अवरुद्ध कर देगा।

4

UPDATED: सबसे छोटा रास्ता:

Anonymous Methods और Object Initializer का उपयोग करना:

public void Repeater(Button btn, int interval) 
{ 
    var timer = new Timer {Interval = interval}; 
    timer.Tick += (sender, e) => DoProgress(); 
    btn.MouseDown += (sender, e) => timer.Start(); 
    btn.MouseUp += (sender, e) => timer.Stop(); 
    btn.Disposed += (sender, e) => 
         { 
          timer.Stop(); 
          timer.Dispose(); 
         }; 
} 
+0

बेहतर भी MouseUp पर टिक घटना सदस्यता समाप्त करने के। –

+0

भी टाइमर का निपटान करना न भूलें। – Joe

+0

आप एक 'टाइमर' का उपयोग कर रहे हैं और अज्ञात विधि वास्तविक विधि लिखने के बजाय केवल एक छोटा रास्ता है। क्या यह फ्रेमवर्क 4.0 में मौजूद नहीं है? –

0

मैं, एक टाइमर जो क्रिया करने और MouseUp घटना पर यह बंद हो जाएगा शुरू करने के लिए MouseDown घटना संभाल कर सकते हैं लेकिन मैं को इस समस्या को हल करने का एक आसान तरीका ढूंढ रहा हूं

आप पुन: प्रयोज्य तरीके से इसे लिखकर इसे आसान बना सकते हैं। आप अपना खुद का Button कक्षा प्राप्त कर सकते हैं जिसमें यह व्यवहार है।

या एक वर्ग है कि आप किसी भी बटन को देते हैं यह इस व्यवहार देने के लिए कर सकते हैं लिखें।

class ButtonClickRepeater 
{ 
    public event EventHandler Click; 

    private Button button; 
    private Timer timer; 

    public ButtonClickRepeater(Button button, int interval) 
    { 
     if (button == null) throw new ArgumentNullException(); 

     this.button = button; 
     button.MouseDown += new MouseEventHandler(button_MouseDown); 
     button.MouseUp += new MouseEventHandler(button_MouseUp); 
     button.Disposed += new EventHandler(button_Disposed); 

     timer = new Timer(); 
     timer.Interval = interval; 
     timer.Tick += new EventHandler(timer_Tick); 
    } 

    void button_MouseDown(object sender, MouseEventArgs e) 
    { 
     OnClick(EventArgs.Empty); 
     timer.Start(); 
    } 

    void button_MouseUp(object sender, MouseEventArgs e) 
    { 
     timer.Stop(); 
    } 

    void button_Disposed(object sender, EventArgs e) 
    { 
     timer.Stop(); 
     timer.Dispose(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     OnClick(EventArgs.Empty); 
    } 

    protected void OnClick(EventArgs e) 
    { 
     if (Click != null) Click(button, e); 
    } 
} 

फिर आप इसका इस्तेमाल देंगी: उदाहरण के लिए: आप की तरह कुछ कर सकता है

private void Form1_Load(object sender, EventArgs e) 
{ 
    ButtonClickRepeater repeater = new ButtonClickRepeater(this.myButton, 1000); 
    repeater.Click += new EventHandler(repeater_Click); 
} 

या अधिक संक्षेप में, जब से तुम ButtonClickRepeater के लिए एक संदर्भ रखने की जरूरत नहीं है:

private void Form1_Load(object sender, EventArgs e) 
{ 
    new ButtonClickRepeater(this.myBbutton, 1000).Click += new EventHandler(repeater_Click); 
} 
संबंधित मुद्दे