2010-11-10 21 views
6

मेरे पास विंडोज़ फॉर्म है, सी # में, 7 टेक्स्ट बॉक्स के साथ। प्रत्येक टेक्स्ट बॉक्स 2 या 3 अन्य अपडेट करता है जब उसका मान बदल जाता है और स्वीकार किया जाता है। मैं जो करना चाहता हूं वह किसी भी तरह उन टेक्स्ट बॉक्स को लेता है जिन्हें अद्यतन करने की आवश्यकता होती है और उन्हें हल्के रंग के रंग या कुछ के साथ "फ़्लैश" बनाते हैं। इसका उद्देश्य उपयोगकर्ता को यह दिखाने के लिए है कि फ्लेयर के एक जोड़े के साथ क्या अपडेट किया जा रहा है।सी # के साथ विंडोज़ फॉर्म में टेक्स्ट बॉक्स को अपडेट करते समय मैं "फ्लैश" प्रभाव कैसे प्रोग्राम करूं?

मुझे यकीन नहीं है कि ऐसा करने का कोई आसान तरीका है और इसलिए मैं यहां पूछ रहा हूं। मैं टाइमर, थोड़ी देर लूप का उपयोग कर सकता हूं, और टेक्स्ट बॉक्स पर कम अल्फा चैनल के साथ बैक कलर बैक कलर पर नियंत्रण कर सकता हूं, मुझे लगता है, लेकिन मैं देखना चाहता हूं कि कोई बेहतर तरीका है या नहीं।

jQuery UI में "हाइलाइट" प्रभाव होता है जो दिखाता है कि मैं क्या हासिल करना चाहता हूं (हालांकि मैं चाहता हूं कि मेरा थोड़ा धीमा हो)। बस jQuery UI Effects Demo page पर जाएं, विंडो में ड्रॉप-डाउन बॉक्स से "हाइलाइट" का चयन करें और "प्रभाव चलाएं" पर क्लिक करें।

संपादित
मैं अपने खुद के अपने समय और संसाधनों की कमी के आधार पर समाधान के साथ जाना था, लेकिन पाठ बॉक्स पारदर्शी रंग का समर्थन नहीं करते के रूप में हंस Passant द्वारा उल्लेख किया है। इसलिए, मैंने एक स्व-स्टॉपिंग टाइमर का उपयोग किया जो आर, जी, और बी मानों को बढ़ाता है जब तक कि नियंत्रण पूरी तरह से सफेद न हो (आर = 255, जी = 255, बी = 255);

संपादित 2
के बाद हम .NET 4.0 के लिए अद्यतन जॉर्ज जॉनसन के समाधान का एक परिवर्तन का उपयोग कर एक विस्तार पद्धति के रूप में फ्लैश घटना recoding अप घाव। यह एक बहुत साफ समाधान है, मुझे लगता है, और विस्तार विधि इसे स्वचालित रूप से किसी भी using पर उपलब्ध कराती है।

+0

मुझे लगता है कि अपने विधि सीधे आगे समाधान है। JQuery का सरल वेब पेज के लिए है ... – Bolu

+1

सच है। JQuery लिंक का उद्देश्य मैं जो हासिल करना चाहता हूं उसका एक दृश्य उदाहरण देना है। –

+0

समय और अन्य सीमाओं पर बाधा के आधार पर, मुझे लगता है कि अगर मेरा विचार ठीक है तो मुझे उस के साथ जाना होगा। यह मेरे अनुभव और उपलब्ध संसाधनों के साथ कोड के सबसे सरल और सबसे आसान/सबसे तेज़ है। ये सभी महान जवाब हैं और मैं इनपुट की सराहना करता हूं। मैंने अपने प्रश्न को नई विधि के साथ अपडेट किया है जिसका उपयोग मैं कर रहा हूं। –

उत्तर

9

आप फ्लैशिंग टेक्स्टबॉक्स के प्रति अलग थ्रेड को स्पिन कर सकते हैं अपने टेक्स्टबॉक्स को चमकाने के दौरान इस्तेमाल होने से अपने फॉर्म को अवरुद्ध करें। थ्रेड के कताई के रूप में अपने फॉर्म को आमंत्रित करना सुनिश्चित करें, क्रॉस थ्रेडिंग की आवश्यकता होगी। नीचे पूरा समाधान।

private void Form1_Load(object sender, EventArgs e) 
{ 
    // textBox1 is the control on your form. 
    // 1000 is the total interval between flashes 
    // Color.LightBlue is the flash color 
    // 10 is the number of flashes before the thread quits. 
    Flash(textBox1, 1000,Color.LightBlue,10); 
    Flash(textBox2, 1500,Color.Green,10); 
    Flash(textBox3, 100,Color.Red,10); 
    Flash(textBox4, 500,Color.Brown,10); 
    Flash(textBox5, 200,Color.Pink,10); 
} 

public void Flash(TextBox textBox, int interval, Color color, int flashes) 
{ 
    new Thread(() => FlashInternal(textBox, interval, color, flashes)).Start(); 
} 

private delegate void UpdateTextboxDelegate(TextBox textBox, Color originalColor); 
public void UpdateTextbox(TextBox textBox, Color color) 
{ 
    if (textBox.InvokeRequired) 
    { 
     this.Invoke(new UpdateTextboxDelegate(UpdateTextbox), new object[] { textBox, color }); 
    } 
    textBox.BackColor = color; 
} 

private void FlashInternal(TextBox textBox, int interval, Color flashColor, int flashes) 
{ 
    Color original = textBox.BackColor; 
    for (int i = 0; i < flashes; i++) 
    { 

     UpdateTextbox(textBox, flashColor); 
     Thread.Sleep(interval/2); 
     UpdateTextbox(textBox, original); 
     Thread.Sleep(interval/2); 
    } 
} 

यह आपके फॉर्म पर टाइमर नियंत्रणों को समर्थन देने से बचाता है।

+0

वाह। यह एक अच्छा विचार है, हालांकि मुझे .NET 2.0 से आगे बढ़ने के लिए बॉस की आगे बढ़ने की आवश्यकता है। फिलहाल यह वह ढांचा है जिसे हम लक्ष्य बना रहे हैं और लैम्ब्डा अभिव्यक्तियों के लिए समर्थन नहीं है। मुझे यह भी नहीं लगता कि मैं इस कोड को समय-समय पर परियोजना के साथ काम कर सकता हूं। हालांकि, आपकी मदद की सराहना की जाती है। –

+0

हमने कुछ समय पहले .NET 4 को अपडेट किया था, इसलिए मैंने फ़्लैश ईवेंट को रिकोड करने और आपके समाधान की विविधता का उपयोग करके घायल हो गए। एक विस्तार विधि का उपयोग किया गया ताकि आप केवल 'myTextBox.Flash (...)' को कॉल कर सकें। :) सलाह के लिये धन्यवाद। –

0

यदि आप WinForms का उपयोग करने के अपने तरीकों पर सेट हैं, तो मेरे सीमित ज्ञान के साथ, मैं मदद करने के लिए तीसरे पक्ष के नियंत्रण प्राप्त करने का सुझाव दे सकता हूं। नाम से कुछ टेलरिक और घटक हैं। यदि आप कुछ WinForms चाहते हैं, तो आप शायद WPF का उपयोग कर सकते हैं और XAML में कस्टम एनिमेशन विकसित कर सकते हैं (जो मुझे लगता है कि यूआई राज्यों और एनिमेशन बनाने में सिल्वरलाइट XAML के समान हैं)। इनके अलावा, मैं किसी भी मदद प्रदान करने के अनुभव से बाहर हूं।

+1

मुझे तीसरे पक्ष के नियंत्रण पुस्तकालय की संभावित कठिनाइयों को मानने के लिए थोड़ा जटिल कारण लगता है जब आप यहां प्राप्त प्रभाव को प्राप्त कर सकते हैं जो कि यहां व्युत्पन्न नियंत्रण में बहुत ही सरल है। यह जानना दिलचस्प होगा कि क्या कोई तृतीय पक्ष नियंत्रण इस कार्यक्षमता को प्रश्न के अनुसार सुझाए गए तरीके से लागू करता है। –

0

अपने ऐप के आधार पर, ऐसा करने का एक शानदार तरीका आपके टेक्स्टबॉक्स की एक छवि की गामा बदलकर है। यह निश्चित रूप से इस बात पर निर्भर करता है कि आप इसमें कितना समय रखना चाहते हैं, लेकिन यह निश्चित रूप से करने योग्य है। मैंने छवि के गामा को समायोजित करने और आपके नियंत्रण की छवि प्राप्त करने के तरीके पर कई ट्यूटोरियल देखे हैं।

उसने कहा, मुझे यह भी विश्वास है कि टेक्स्टबॉक्स के बैककलर को पारदर्शी बनाने के लिए यह अनौपचारिक है। आपके शब्दों से मैं केवल अनुमान लगा सकता हूं कि आप अंतर्निहित नियंत्रण के बैककलर से टेक्स्टबॉक्स को बैककलर में फीका करना चाहते हैं, इस मामले में समस्या फिर से छोटी है। लेकिन अगर आपके पास पृष्ठभूमि छवि है, तो आपको शायद पुनर्विचार करना चाहिए। फिर भी, यह अभी भी संभव है और यदि आप इसे पूरा करने की कोशिश कर रहे हैं तो मैं यह कैसे कर सकता हूं इसके बारे में आपके लिए एक लिंक खोद सकता हूं।

त्वरित आसान समाधान टेक्स्ट रंग और सफेद रंग से आपके वर्तमान अग्रभूमि रंग को पीठ रंग को एनिमेट करना होगा।

3

डब्ल्यूपीएफ इसके लिए बिल्कुल सही लगेगा। आप इसे WPF में बना सकते हैं और इसे WinForms में होस्टेड एलिमेंट के रूप में उपयोग कर सकते हैं। नई परियोजना WPF उपयोगकर्ता नियंत्रण और जोड़े, इस XAML में:

<UserControl x:Class="WpfControlLibrary1.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="20" d:DesignWidth="300"> 
<TextBox> 
    <TextBox.Triggers> 
     <EventTrigger RoutedEvent="TextBox.TextChanged"> 
      <BeginStoryboard> 
       <Storyboard AutoReverse="False" BeginTime="0" > 
        <DoubleAnimation Storyboard.TargetName="Foo" 
           Storyboard.TargetProperty="Opacity" 
           From="0" To="1" Duration="0:0:1"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </TextBox.Triggers> 
    <TextBox.Background> 
     <SolidColorBrush Opacity="1" x:Name="Foo" Color="LightGray" /> 
    </TextBox.Background> 
</TextBox> 
</UserControl> 

(यह एक छोटे काम कर सकता है, लेकिन यह एक शुरुआत है)।वहाँ तुम्हारे पास है - एक फैंसी पाठ बॉक्स :)

समाधान का निर्माण, और एक नया आइटम टूलबॉक्स में दिखाई देगा - बस अपने फार्म को & ड्रॉप खींचें, WPF ElementHost तत्व के अंदर आयोजित किया जाएगा। इसकी सुंदरता यह है कि आप डब्ल्यूपीएफ में दृश्य शैलियों में बहुत कुछ कर सकते हैं, हालांकि, यह डब्ल्यूपीएफ होस्ट किया गया है जो आपके समाधान के लिए कुछ वजन जोड़ता है ...

+1

मैंने पहले कभी WPF के साथ काम नहीं किया है। यह वास्ताव में अच्छा है। हालांकि, समय पर इस समय सीखने के लिए समय की कमी और एक परियोजना जिसे .NET 4.0 में परिवर्तित नहीं किया गया है (हमें कनवर्ट करने से पहले मालिक की मंजूरी का इंतजार करना है) मुझे एक अलग उत्तर के साथ जाना है। हालांकि, मैं डब्ल्यूपीएफ में जांच करूंगा। –

2

TextBox से अपनी खुद की कक्षा प्राप्त करें। इसे Flash() विधि दें जो चमकती शुरू होती है। बस BackColor को पेस्टल रंग में बदलें। अल्फा का उपयोग न करें, जो TextBox पर काम नहीं करता है।

आपको इस वर्ग के सभी उदाहरणों को एक सामान्य टाइमर साझा करना चाहिए ताकि वे एक ही समय में फ्लैश हो जाए। टाइमर स्थिर और संदर्भ-आपके पास मौजूद उदाहरणों की संख्या को गिनें। Dispose(bool) ओवरराइड में नीचे, कन्स्ट्रक्टर में जोड़ें।

+0

यह एक अच्छा विचार है और मैं इसे कुछ समय बाद लागू कर सकता हूं। मैं विशेष स्वरूपण और सत्यापन के लिए अपना स्वयं का व्युत्पन्न टेक्स्ट बॉक्स बनाने पर विचार कर रहा हूं, इसलिए यह उस परियोजना के दायरे में हो सकता है। –

0

आप सूत्रण का उपयोग करने में रुचि नहीं रखते हैं, यहाँ जॉर्ज जॉनसन के जवाब पर निर्माण मेरी कार्यान्वयन के रूप में निम्नानुसार है:

private bool CurrentlyFlashing = false; 
private void FlashInternal(TextBox textBox, int interval, Color flashColor, int flashes) 
{ 
    if (CurrentlyFlashing) return; 

    CurrentlyFlashing = true; 
    Color original = textBox.BackColor; 
    for (int i = 0; i < flashes; i++) 
    { 
     UpdateTextbox(textBox, flashColor); 
     Application.DoEvents(); 
     Thread.Sleep(interval/2); 
     UpdateTextbox(textBox, original); 
     Application.DoEvents(); 
     Thread.Sleep(interval/2); 
    } 
    CurrentlyFlashing = false; 
} 
private delegate void UpdateTextboxDelegate(TextBox textBox, Color originalColor); 
public void UpdateTextbox(TextBox textBox, Color color) 
{ 
    if (textBox.InvokeRequired) 
    { 
     this.Invoke(new UpdateTextboxDelegate(UpdateTextbox), new object[] { textBox, color }); 
    } 
    textBox.BackColor = color; 
}