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
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:
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:
Danke für eure Unterstützung!
Mayho
EDIT:
Ich habe es wieder mal mit einem Task gelöst.
Grüße, Mayho!
Ich kaue an einem Problem, komme aber nicht weiter. => Kleine Know-How-Lücke
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 625054
Url: https://administrator.de/contentid/625054
Ausgedruckt am: 23.11.2024 um 22:11 Uhr