Witam, mam potrzebę przekonwertować object na Grid, lecz nie wiem jak to zrobić. Czy ktoś jest w stanie mi pomóc?
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.
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);
}
}
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);
}
}
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)
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. :|
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)
Zostaw WPF i naucz się wątków.
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
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.
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.