Jak zmienić stan kontrolki z innej klasy?

0

Mam problem ze zmianą stanu kontrolki w WPF z innej klasy oraz innego wątku. Wygląda to następująco posiadam klasę główną MainWindow która wyświetla okienko programu. Z klasy tej wywołuję nowy wątek w innej klasie. I teraz chcę z tego wątku zmienić kontrolkę w MainWindow. Napisałem coś takiego:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Class1 th = new Class1();
            Thread th2 = new Thread(th.DoSomething);
            th2.Start();

        }

        private void progressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {

        }

    }

 
 class Class1
    {
        public Class1()
        {
        }
        public void DoSomething()
        {
            for (int i = 0; i < 101; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(100);
                progressBar.Dispatcher.BeginInvoke((Action)(() =>
                {
                    progressBar.Value = i;
                }), null);
            }
        }
    }
 

Podczas kompilacji otrzymuję błąd:

The name 'progressBar' does not exist in the current context

Jeżeli metodę DoSomething() umieszczę w klasie MainWindow i tam ją wywołam wszystko działa poprawnie. Próbowałem już różnych rozwiązań ale rezultat był ciągle podobny.

0

A gdzie w klasie Class1 masz pole progressBar do którego chcesz się odwoływać?

0

Poprawiłem trochę kod. Wszystko się kompiluje i niby dostaję się już do progressbar w głównym wątku ale niestety pasek dalej nie zmienia swojej wartości. Co dalej robię źle ?

class Class1:MainWindow
    {
        public Class1()
        {
        }
        public void DoSomething()
        {
            Thread.CurrentThread.Name = "Client";
            Console.WriteLine(Thread.CurrentThread.Name);
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(50);

                progressBar.Dispatcher.BeginInvoke(
                (ThreadStart)delegate ()
                {
                    Console.WriteLine(Thread.CurrentThread.Name);
                    progressBar.Value = i;
                });
            }
        }
    }
 public partial class MainWindow : Window
    {
        static bool fr = true;
        public MainWindow()
        {

            InitializeComponent();
            if(fr)
            {
                fr = false;
                Thread.CurrentThread.Name = "Main";
            }

            Console.WriteLine("glowny:" + Thread.CurrentThread.Name);

        }

        private void nazwij()
        {
            Thread.CurrentThread.Name = "Main";
        }
       
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Class1 th = new Class1();
            Thread th2 = new Thread(th.DoSomething);
            th2.Start();

        }

        private void progressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {

        }
    }

Wyjście:

glowny:Main
Client
Main
Main
Main
Main
Main
Main
Main
Main
The thread 0x16d0 has exited with code 0 (0x0).
Main
Main

Kiedy sprawdzam wartość progressbar przy wywołaniu Dispatcher.BeginInvoke podawana jest wartość ustawiona a nie początkowa.

0

Jakieś pomysły ?

0
some_ONE napisał(a):

A gdzie w klasie Class1 masz pole progressBar do którego chcesz się odwoływać?

Pytanie nadal pozostaje aktualne. Gdzie progressBar do którego chcesz się odwoływać?

0

Mam dziwne wrażenie, że coś tu nakombinowałeś. To ma być PROSTE. Spójrz na to, może Ci pomoże:
Blokowanie interfejsu przez nowy wątek c#

1 użytkowników online, w tym zalogowanych: 0, gości: 1