Frage

Für meine WPF-Anwendung Ich habe eine virtuelle Tastatur entwickelt. Es läuft auf meiner Entwicklung Maschine in Ordnung. auf langsameren Maschinen ist jedoch auf die Schaltfläche klicken Reaktion langsam. Nachdem die Schaltfläche geklickt wird, gibt es eine Verzögerung, bevor die Anzeige aktualisiert mit dem Button Down-Zustand und dem Schaltflächen-Ereignisse. Was kann ich tun, um diese Verzögerung zu entfernen? Ist das Problem ein WPF-Anzeigeproblem?

Denken wurde der Event-Handler, die langsam war, habe ich mehrere Ansätze versucht, eine Tastaturtaste gedrückt Ereignis zu senden. Egal, was ich versucht habe, ist die Interaktion immer noch langsam. Derzeit bin ich mit:

SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

Importiert aus user32.dll. Meine Event-Handler zu dem Punkt vereinfacht wird, wo es nur die Parameter für und ruft die obige Funktion zu schaffen.

Ich habe auch versucht, die folgende verwenden, aber hatte keine bessere Leistung:

 System.Windows.Input.Keyboard.FocusedElement.RaiseEvent(...)

Wie kann ich die Verzögerung los?

War es hilfreich?

Lösung

Können Sie sagen, was Ihre Verzögerung verursacht?

Wenn es etwas langsam in Ihrem Click Fall ist, sollten Sie entweder einen separaten Thread verwenden Sie den Code auszuführen. Innerhalb des neuen Thread, wenn Sie Code haben, der auf dem UI-Thread ausgeführt werden müssen, verwenden Sie Dispatcher.BeginInvoke es die Warteschlange ausgeführt werden, wenn die UI-Verarbeitungszeit hat. Um die Benutzeroberfläche reagiert, zu halten, müssen Sie an der Haupt (UI) Thread keine schweren Code halten.

Wenn die virtuelle Tastatur auf eine bestimmte Window lokal ist, abhängig von der Komplexität dessen, was Sie tun, können Sie eine href nehmen <= "http://ascendedguard.com/2007/08/wpf-virtual-keyboard .html“rel =‚nofollow noreferrer‘> ein Ansatz, den ich in der Vergangenheit verwendet haben, wo man nur manuell in Tastaturzeichen in die TextBox füllen, die den Fokus hat.

Hinweis: Ich schrieb, dass Code mehr als 2 Jahre und hasse es, als Ergebnis. Während ich normalerweise so tun, als würde es nicht existieren, kann es Ihnen helfen. Ich habe es besser gemacht seitdem, aber das Konzept selbst auf langsameren Maschinen keine Performance-Probleme hatte. Ich würde Jeff Atwood zitieren Blog über den Code, den Sie am meisten hasse, ist Ihre eigene, aber, na ja ...

Edit: Da Sie noch Fragen haben, auch mit Click leer ist, können Sie auf andere potenzielle Stockungen suchen. Ist der CPU-Benutzer bei 100% von etwas ausgereizt? Entweder zu schwer Animationen oder ein anderes mögliches Ereignis? Die meisten UI Verzögerungen sind in der Regel ein Ergebnis entweder eine ausgereizt CPU oder ein Ereignis zu lange auf das Gewinde des UI nehmen.

Eine Möglichkeit ist, wenn Ihre Window AllowsTransparency="True" hat eine großen Teil der Arbeitsbelastung, die normalerweise an die Grafikkarte gehen würde, wird nun in der Software gerendert werden, und schwere Leistungseinbußen haben. Vergangenheit, dass Sie einen Blick darauf werfen können in diesem Microsoft-Artikel auf Optimierung der WPF-Anwendungsleistung für einige allgemeine Tipps, die beschleunigen könnte Ihre Verarbeitung.

würde ich vorschlagen, jemand in XAML zu entwickeln, dass die letzten Artikel lesen. Der Unterschied in der Leistung zwischen solchen kleinen Details wie TextBlock vs. Label, oder DependencyProperty des vs. INotifyPropertyChanged Implementierung kann wirklich addieren, und die Tatsache, dass sie gegen jeden tun Benchmarking zeigt wirklich die Bedeutung des richtigen Designs.

Andere Tipps

lief gerade über diese Diskussion. Ich habe eine WinForms-Anwendung, wo die Taste Reaktion langsam war. Dies geschah, nachdem ich auf 64-Bit-Upgrade Windows 7. Ich fand, dass, wenn ich mein Projektziel auf „x86“ geändert (statt „Any CPU“), die langsame Taste Reaktion ging weg.

Wenn Sie Ihr Event-Handler eine lange Zeit zu beenden dauert, wird die UI für diese Zeit einsperren. Versuche dies Ereignishandler:

  private void button1_Click(object sender, RoutedEventArgs e)
  {
     System.Threading.Thread.Sleep(5000);
  }

Ihre Event-Handler wahrscheinlich beendet nur schneller auf eine schnellere Maschine. Für langsame Operationen, können Sie die Arbeit an einem anderen Thread drücken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top