Avatar billede dehdar Nybegynder
17. juli 2010 - 23:14 Der er 4 kommentarer

Hvordan tilgår jeg WPF controller fra andre klasser?

Hej. Jeg har oprettet et WPF projekt, som består af et gridview og en række forskellige controller. I min Window1 klasse, altså den som arver fra "Window" opretter jeg en tråd, som tilgår elementerne ved brug af en dispatcher - altså på følgende måde:

            Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { controllerNavn.Funktion(argument); }, null);

controllerNavn er selvfølgelig kendt af Window1 fordi det er det vindue eller rettere sagt det objekt, som ejer kontrollen. Men hvis jeg f.eks. vil gøre det samme i en tråd, som bliver oprettet af en klasse udenfor Window1, så kan jeg ikke referer til "controllerNavn". Hvad skal jeg gøre her? Videregive en reference virker som et hax, er der en holdbar løsning?
Avatar billede janus_007 Nybegynder
18. juli 2010 - 01:13 #1
Har du kigget på SynchronizationContext?
Avatar billede dehdar Nybegynder
18. juli 2010 - 01:21 #2
Nej jeg aner ikke hvad det er, men jeg vil lige google.
Avatar billede dehdar Nybegynder
18. juli 2010 - 15:19 #3
Jeg har valgt en ny løsning. Prøv at tjek følgende kode. Kan jeg rejse et ProgressChanged event fra et RandomClass objekt uden at jeg har en reference til worker fra Window1() klassen?

  public partial class Window1 : Window
  {
    BackgroundWorker worker;
    RandomClass randomClass;

    public Window1()
    {
      InitializeComponent();

      worker = new BackgroundWorker();
      randomClass = new RandomClass(worker);
     
      // Setting up eventhandlers for the worker
      worker.WorkerReportsProgress = true;

      worker.DoWork += delegate(object s, DoWorkEventArgs args)
      {
        randomClass.RandomMethod();
      };

      worker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
      {
        int percentage = args.ProgressPercentage;
        progressBar1.Value += percentage;

      };
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      worker.RunWorkerAsync();
    }
  }

  public class RandomClass
  {
    BackgroundWorker worker;

    public RandomClass(BackgroundWorker worker)
    {
      this.worker = worker;
    }
    public void RandomMethod()
    {
      worker.ReportProgress(1);
    }
  }
Avatar billede janus_007 Nybegynder
19. juli 2010 - 09:47 #4
Jo sådan kan du godt gøre det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester