Nietypowe konwertowanie zmiennych (object na Grid)

0

Witam, mam potrzebę przekonwertować object na Grid, lecz nie wiem jak to zrobić. Czy ktoś jest w stanie mi pomóc?

1

Trochę mało precyzyjnie. Przydałby się kawałek kodu.
Jeżeli w obiekcie typu object, trzymasz referencje do obiektu, który jest albo dziedziczy po typie Grid to możesz np. rzutować (Grid)object.

0
 public void anime_nuta_start(int i)
        {
            Thread anime_nuta_W = new Thread(new ParameterizedThreadStart(anime_nuta));
            switch (i)
            {
                case 1:
                    anime_nuta_W.Start(Nuta1);
                    break;
                case 2:
                    anime_nuta_W.Start(Nuta2);
                    break;
//itd.
private void anime_nuta(object imgO)
        {
            Grid img = imgO;
            for (int i = 1; i < 100; i++)
            {
                img.Opacity = i;
                Thread.Sleep(10);
            }
        }
0
private void anime_nuta(object imgO)
        {
            Grid img = imgO as Grid; // można też jak poniżej
//            Grid img = (Grid)imgO; //przy czym tutaj ja się nie uda to wywali wyjątek

            for (int i = 1; i < 100; i++)
            {
                img.Opacity = i;
                Thread.Sleep(10);
            }
        }
0

Wystąpił niespodziewany problem, otóż wywala mi wyjątek:

Additional information: Wątek wywołujący nie może uzyskać dostępu do tego obiektu, ponieważ należy on do innego wątku.
private void anime_nuta(object imgO)
        {
            Grid img = imgO as Grid; 
                                     
            for (float i = 1; i < 100; i++)
            {
                img.Opacity = i; //**<---- Tutaj**
                Thread.Sleep(10);
            }
        }

Nie wiem czemu tak się dzieje, ponieważ wszystko należy do tego wątku (metody)

0
Kubek napisał(a):

Nie wiem czemu tak się dzieje, ponieważ wszystko należy do tego wątku (metody)

No przecież sam osobiście uruchamiasz tę metodę w nowym wątku Thread kilka linijek wyżej. :|

0

Ale "img" jest obiektem który został stworzony w metodzie którą sam osobiście uruchomiłem.

Grid img = imgO as Grid; 

A "imgO" jest obiektem który przesłałem do tej metody

private void anime_nuta(object imgO)
0

Zostaw WPF i naucz się wątków.

1

Nie to nie tak działa.
img jest tylko referencją mówiącą, że gdzieś tam w pamięci siedzi sobie obiekt, a dodanie "as Grid" mówi, żeby traktować go jak Grid. Natomiast wszystkie własności są te same co w imgO, który jest traktowany jako object.
Ogólnie temat dość wyczerpująco omówiony pod https://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c/661662#661662

0
somekind napisał(a):

Zostaw WPF i naucz się wątków.

To może polecisz mi jakiś poradnik, bo jak na razie w internecie znajduje tylko jak stworzyć wątek i nic więcej.

0

aż z ciekawości sprawiłem jak to w wpf jest z zrobione, wystarczy

private void anime_nuta(object imgO)
        {
            Grid img = imgO as Grid; 
 
            for (float i = 1; i < 100; i++)
            {
                 Application.Current.Dispatcher.Invoke(() => {
                     grid.Opacity = i;
                });
                Thread.Sleep(100);
                Thread.Sleep(10);
            }
        }

Co do nauki, to zaczął bym chyba jednak od konsoli. W wpf, od razu musimy uczyć się xaml. Wątki też zostawiłbym na później.

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