michi.wtr
Goto Top

WPF - C-Sharp - Buttons mit Thread bearbeiten

Hey zusammen,

Gibt es eine Möglichkeit, die Buttons eines Fensters mit einem separaten Thread zu aktualisieren? Habe ich eine GUI entwickelt, mit der man eine PDF Datei unter einem bestimmten Ordner öffnen kann. Während dem Öffnen, bzw. dem bearbeiten der Datei sollen einige Buttons in der Anwendung gesperrt sein.
Nachdem diese gespeichert wurde, sollen diese Buttons aktiviert werden und aktivierbar sein. Deshalb hatte ich die Idee, beim Öffnen der PDF-Datei einen Thread zu starten, der überprüft, ob sich das Änderungsdatum der Datei ändert. Falls ja, soll er die Buttons aktualisieren.

Hier der Code für den Thread:

public partial class ProcessingPage : Page
{
        private FileInfo file;
        public Thread thread { get; }

        public ProcessingPage(FileInfo file)
        {
            InitializeComponent();
            this.window = window;
            this.file = file;
            textblock.Text = file.FullName;

            thread = new Thread(new ThreadStart(Wait_FileSaved));
            thread.Start();
        }


        /// <summary>
        /// Waits until the file has been edited
        /// </summary>
        /// <param name="file">file to get processed</param> 
        private void Wait_FileSaved()
        {
            Console.WriteLine("{0} | {1}", file.LastWriteTimeUtc, new FileInfo(file.FullName).LastWriteTimeUtc);  
            while (file.LastWriteTimeUtc.Equals(new FileInfo(file.FullName).LastWriteTimeUtc))
            {
                Thread.Sleep(2000);
            }
            Console.WriteLine("Datei geändert");  
            //Write-Log
            EnableButtons(btnChecked, btnDenied, btnDenied, btnPreChecked, btnClarify, btnPass);
        }
}


Wenn ich nun die Methode EnableButtons aufrufe, welche einfach alle übergebenen Buttons auf IsEnabled setzt, erhalte ich eine Exception, dass diese Objekte einem anderen Thread angehören.

exceptionthreadobject


Nach dem nachforschen im Internet habe ich folgenden Beitrag gefunden:

https://mycsharp.de/forum/threads/33113/faq-controls-von-thread-aktualis ...

Deshalb habe ich den dort beschriebenen Code für meine EnableButtons-Methode implementiert:

private bool EnableButtons(params Button[] buttons)
        {
            if (!this.Dispatcher.CheckAccess())
                return (bool)this.Dispatcher.Invoke((Func<Button[], bool>)EnableButtons, buttons);   xxxxxxxxxxxxxxx
            foreach (Button button in buttons)
                button.IsEnabled = true;
            return true;
        }

Die mit den "xxxxxxxxxxxxxxx" markierte Zeile gibt mir im Debugger dann aber folgende Antwort:

delegate

Was genau ist das denn für ein Pfad der dort durchsucht wird? Ein Laufwerk f:\ habe ich nicht, was also ist "f:\dd\..." ?
Das erste mal, als die Nachricht delegate.cs nicht gefunden kam, hatte ich außerdem die Möglichkeit, NuGet und noch eine Seite anzuhaken die durchsucht werden sollten.

Gruß Micha

Content-Key: 6807934650

Url: https://administrator.de/contentid/6807934650

Printed on: April 28, 2024 at 06:04 o'clock