Jak zmienić stan kontrolki z innej klasy?

Jak zmienić stan kontrolki z innej klasy?
UN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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:

Kopiuj
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)
        {

        }

    }

 
Kopiuj
 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:

Kopiuj
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.

SO
  • Rejestracja: dni
  • Ostatnio: dni
0

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

UN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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 ?

Kopiuj
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;
                });
            }
        }
    }
Kopiuj
 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:

Kopiuj
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.

UN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Jakieś pomysły ?

litrmleka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: lubuskie
  • Postów: 201
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ć?

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5052
0

Mam dziwne wrażenie, że coś tu nakombinowałeś. To ma być PROSTE. Spójrz na to, może Ci pomoże:
http://4programmers.net/Forum/Newbie/276301-blokowanie_interfejsu_przez_nowy_watek_c?p=1285037#id1285037

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.