mayho33
Goto Top

C-Sharp WPF Non-Static Methode(this) von Static-Methode aufrufen

Hi @ All,

Ich kaue an einem Problem, komme aber nicht weiter. => Kleine Know-How-Lücke face-wink
Ich hoffe es kann mir jemand von euch helfen und bedanke mich schon im Voraus.

Worum gehts:
In einer GUI habe ich 2 Buttons (OK und FERTIG), unter anderem eine Non-Static-Methode für einen CountDown (Wird in der GUI angezeigt) und mehrere UserControls.
Die CountDown-Methode rufe ich direkt in MainWindow_Loaded() auf und switche auf das erste UserControl. Die Methode ist dazu da um nach Ablauf des CountDown einen Button zu klicken. Ist der Button geklickt, stoppe ich den Counter und setze ihn zurück für die nächste Verwendung.


Exemplarisch:
public enum CountDownUntil_Filter
{
    OnStart = 1,
    OnFinish = 2
}

public MainWindow()
{
    InitializeComponent();
    Loaded += MainWindow_Loaded;
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    //schaltet das genannte UC auf Visible und enabled 
    //und steuert auch alle anderen Visible/Enabled-Verhalten
    UISwitch(UISwitch_Filter.START_UI);

    //Um diese Methode gehts
    CountDown_UntilButtonClick(this, CountDownUntil_Filter.OnStart);
}

So weit so gut! Das funktioniert.


Das Problem:
Irgendwann im Ablauf des Programms switche ich auf das letzte UserControl und muss die CountDown-Methode nochmal aufrufen. Diesmal aber aus eine Static-Methode in einer anderen Klasse. Ich weiß, dass ich mit New() eine neue Instanz von MainWindow erstellen kann. Das ist aber nicht gewünscht, weil sonst der CountDown nicht in der GUI angezeigt wird und die IDE abstürzt. Liegt eventuell daran, dass ich im Constructor ein System.Windows.Forms.NotifyIcon initialisiere. Das brauche ich um das Window in den Tray zu minimieren.


Meine Frage:
Wie kann ich von einer statischen Methode aus einer anderen Klasse eine non-static-Methode aufrufen? Komplett das Klassen-Design ändern (hoffentlich nicht)? Ein Event? Ein Delegate? <= mit beidem keine Erfahrung.


Hier der Code der CountDown-Methode:
public MainWindow()
{
    private static DispatcherTimer dt_Timer_nonStatic;
    private static TimeSpan ts_TSpawn_nonStatic;

    private void CountDown_UntilButtonClick(CountDownUntil_Filter filter)
    {
        if (AfterAction == AfterAction_Filter.Nothing && filter == CountDownUntil_Filter.forFinish)
        {
            CountDown_VISIBILITY = Visibility.Hidden;
            return;
        }

        //DelayStart ist der Wert wie lange gewartet werden soll
        DateTime dateToCalcWith  = DelayStart;
        double dif                               = (dateToCalcWith - DateTime.Now).TotalSeconds;
        ts_TSpawn_nonStatic          = TimeSpan.FromSeconds(dif);

        // von hier abgekuckt: https://stackoverflow.com/questions/16748371/how-to-make-a-wpf-countdown-timer
        dt_Timer_nonStatic = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal,
           delegate
           {
               CountDown = ts_TSpawn_nonStatic.ToString(@"hh\:mm\:ss");  
               if (ts_TSpawn_nonStatic.TotalSeconds <= 0)
               {
                   dt_Timer_nonStatic.Stop();
                   CountDown = string.Empty;
                   ButtonAutomationPeer peer = null;

                   switch (filter)
                   {
                       case CountDownUntil_Filter.forInstall:
                           peer = new ButtonAutomationPeer(btn_Install);
                           break;
                       case CountDownUntil_Filter.forFinish:
                           peer = new ButtonAutomationPeer(btn_Finish);
                           break;
                   }

                   IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
                   invokeProv.Invoke();
               }

               ts_TSpawn_nonStatic = ts_TSpawn_nonStatic.Add(TimeSpan.FromMilliseconds(-1000));
           }, Application.Current.Dispatcher);
            
        dt_Timer_nonStatic.Start();

        //schaltet den Button auf IsEnabled=true sobald der Countdown in der GUI erscheint.
        //das dauert immer 1 oder 2 Sekunden
        DelayUntilCountDownHasAppeared_TASK();
    }
}


Danke für eure Unterstützung!

Mayho

EDIT:

Ich habe es wieder mal mit einem Task gelöst.

Grüße, Mayho!

Content-ID: 625054

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

Ausgedruckt am: 23.11.2024 um 22:11 Uhr