2016-07-19 8 views
1

habe ich ein Ereignis (ctc), der ausgelöst wird, wenn eine Textänderung in einem ComboBox auftritt, möchte ich für eine Sekunde seine Zündung verzögern. Ich schrieb diesen Code so weit und steckte es in die MainWindow:Verzögerung Text Änderungsereignis für eine Sekunde wpf

Timer aTimer = new Timer(); 
    aTimer.Interval = 1000; 
    aTimer.Elapsed += new ElapsedEventHandler(ctc); 
    aTimer.Enabled = true; 

Ich bin neu in WPF, und ich möchte wissen, was in ElapsedEventHandler Klammern zu setzen, ich habe das auch Namen setzen, aber ich erhalte eine Fehlermeldung. Muss ich auch irgendetwas zu Xaml-Code für die ComboBox hinzufügen?

+3

wenn Sie verbindlich und .net verwenden 4.5+, dann können Sie auch 'Delay' Eigenschaft (https://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase.delay (v = vs.110) .aspx) – ASh

+1

Warum möchten Sie das Ereignis verzögern? Was versuchst du zu erreichen? Könnten Sie uns mehr Informationen geben? vielleicht gibt es eine bessere Lösung alle zusammen – MichaelThePotato

+0

_ "Wenn eine Textänderung in einer ComboBox auftritt" _ - meinst du "wenn ausgewählte Artikel geändert"? – Sam

Antwort

0

Dies sollte besser sein:

Nach .Net 4.0 Sie (danke ASH) verwenden können:

await Task.Delay(1000); 

Es ist ein nicht blockierenden Anruf.

Dann, nach dieser Aussage, einfach Ihren Text ändern.

Wenn Sie geschehen sein mit .Net 4:

Here is a sample implementation of Delay in .Net 4.0

Es gibt auch Thread.Sleep, aber es scheint, schlechte Praxis zu sein, weil es viele Ressourcen (dank Eli Arbel, Sam) kostet:

await System.Threading.Tasks.Task.Run(() => System.Threading.Thread.Sleep(1000)); 

ohne vollen Qualifier:

await Task.Run(() => Thread.Sleep(1000)); 
+5

'erwarten Task.Delay (1000);' existiert ... – ASh

+0

Dumme Frage, aber wo platziere ich es im Hauptfenster oder in der auch ich will seine Ausführung verzögern? –

+0

Wenn Sie die Änderung immer verzögern möchten, fügen Sie sie ein, bevor Sie den Wert auf Ihre Binding-Eigenschaft im Bindungseigenschafts-Accessor setzen.Sie können das OnPropertyChanged auch einfach verzögern. Verwenden Sie mvvm oder einfach nur Code-Behind? – Mafii

4

Nun, t Der einfachste Weg ist die Verwendung von Delay Eigenschaft als @ASh erwähnt. Ich wusste nicht, darüber vor, aber ich versuchte, und es ist erstaunlich:

XAML:

<ComboBox IsEditable="True" Text="{Binding ComboBoxText, Mode=OneWayToSource, Delay=1000}"> 
    <ComboBoxItem Content="item1" /> 
    <ComboBoxItem Content="item2" /> 
    <ComboBoxItem Content="item3" /> 
</ComboBox> 

View-Modell:

private string comboBoxText; 

public string ComboBoxText 
{ 
    get { return this.comboBoxText; } 
    set 
    { 
     if (this.SetProperty(ref this.comboBoxText, value)) 
     { 
      Trace.WriteLine("*** New text: " + value); 
      // RunDatabaseSearch(value); 
     } 
    } 
} 

Wo SetProperty ist die Umsetzung von INotifyPropertyChanged.

Uhr Ausgabe Fenster in Visual Studio, Text erscheint nach einer Sekunde der letzten Eingabe des Benutzers.

+0

Ehrfürchtig. Klar die richtige Antwort! – Mafii