2017-01-25 3 views
1

konvertieren Ich habe ein WPF-Fenster mit ein paar Tasten, ich habe eine andere Klasse, wo die Manipulation von WPF-Fenster erfolgt. Ich muss eine Schaltfläche des WPF-Fensters von der Klasse nach dem Speichern einer Datei deaktivieren. Dies führt zu dem FehlerKann den Typ System.Windows.WindowCollection nicht in 'UITestApp.UiSimulator

Fehler: nicht Typ System.Windows.WindowCollection 'auf' UITestApp.UiSimulator

Forthe folgenden Code

if (result == true) 
      { 
       // Save document 
       SaveParamFile(dlg.FileName); 
       UISimulator uv = (UISimulator)Application.Current.Windows; 
       uv.btnSave.IsEnabled = false; 
      } 

Antwort

1

Sie sind ein WindowCollection zu Fenster Gießen, weshalb Fehler werfen, müssen Sie das Fenster aus der Sammlung finden und sie werfen müssen. wenn UISimulator das Hauptfenster ist, können Sie wie folgt verwenden,

if (result == true) 
      { 
       // Save document 
       SaveParamFile(dlg.FileName); 
       UISimulator uv = (UISimulator)Application.Current.MainWindow; 
       uv.btnSave.IsEnabled = false; 
      } 

oder müssen Sie wie unter dem Fenster finden,

if (result == true) 
     { 
      // Save document 
      SaveParamFile(dlg.FileName); 
      UISimulator uv = (UISimulator)Application.Current.Windows.OfType<UISimulator>().FirstOrDefault(); 
      uv.btnSave.IsEnabled = false; 
     } 
+0

ordnungsgemäß funktioniert –

0

Application.Current.Windows enthält nur Fenster umwandeln, die auf existieren der Haupt-UI-Thread Es ist nicht empfehlenswert, Fenster in einem anderen Thread als dem Hauptthread der Benutzeroberfläche zu erstellen.

+0

Dann, wie kann ich/Zugriff auf Funktionen eines Steuer om Haupt manipulieren Benutzeroberfläche. Ich bin ein Anfänger in Wpf –

0

Es gibt keine Möglichkeit, direkt von einem anderen Thread auf die Benutzeroberfläche zuzugreifen/sie zu bearbeiten. Die einzige Lösung besteht darin, ein Ereignis im Thread auszulösen und es dann im UI-Thread abzufangen. UI-Elemente haben sehr strenge Thread-Affinitätsanforderungen. Dies bedeutet, dass Sie nur auf das Element des Threads zugreifen können, der es hostet. Dies umfasst alle Arten von Zugriffen einschließlich einfacher Lesevorgänge. Sie können dies mithilfe von delegate implementieren. Geben Sie die folgende Zeile ein, in der Sie die Benutzeroberfläche aktualisieren müssen. Verwenden Sie [Dispatcher.Invoke(DispatcherPriority, Delegate)], um die Benutzeroberfläche von einem anderen Thread oder vom Hintergrund zu ändern.

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate 
{ 
    //Update UI here 
})); 
Verwandte Themen