[WPF][C#] Jak wygenerować dużą ilość kontrolek UI w osobnym wątku?

0

Witam was!

Mój problem polega na tym ze napisałem aplikację w WPF C#

Program posiada textboxa w ktorym cos tam uzytkownik moze wpisywac i w zaleznosci od tego co wpisze program generuje jakies kontrolki Np. przyciski.

Problem polega na tym ze jak generuje te kontrolki to program "zamula", czyli generuje te kontrolki jakies 2 sekundy i przez to zwiesza program na 2 sekundy i uzytkownik musi czekac. Zapewne wiecie jak to wyglada.

Nalezy uzyc tutaj drugiego watku ktory wygeneruje te kontrolki lecz tutaj pojawia sie kolejny problem. Jezeli w osobnym watku staram sie generowac te kontrolki dostaje komunikat o bledzie ze watek nie jest watkiem STA

InvalidOperationException Wątkiem wywołującym musi być STA, ponieważ wiele składników interfejsów użytkownika go wymaga.

Próbowałem za pomocą Thread, BeginInvoke, BackgroundWorkera itd. i niestety to samo. Wątek musi być STA...

Czy da się coś na to zaradzić? Jak generować te kontrolki aby było ok?

Pozdrawiam

0

Wątki tu raczej nie pomogą.

Pokaż kod, jaki używasz do generowania i wstawiania tych kontrolek.

1

A masz przy Mainie [STAThread] ?

0
MSM napisał(a)

A masz przy Mainie [STAThread] ?

A gdzie on ma mieć Maina?

0

Już wiem co było przyczyną. Powodem było to, że kontrolki można tworzyć jedynie w wątku STA. Udało mnie się utworzyć wątek który posiada ten status natomiast mimo wszystko nie mozna w jednym wątku STA dodać kontrolki z innego wątku STA. Rzucany jest wyjątek:

TargetInvocationException
Obiekt docelowy wywołania zgłosił wyjątek.

Sądze, że nic na to się nie poradzi...

Co do [STAThread] to przypominam, że piszę w WPF

Co do generowanie kontrolek to za duzo tego aby wstawiac ale mozna to zasymulowac tworzac Canvas i wrzucajac na niego mnostwo obiektow Line(tworze grafike na podstawie wpisanego tekstu w textboxie).

Mozna np. zasymulowac to tak ze dajesz textboxa i wpisujesz w nim liczbe obiektow Line jakie maja zostac narysowane na Canvas, przy pewnej liczbie to bedzie trwalo tyle ze program zacznie ci sie mulic i interfejs sie zwieszac.

0

WPF nie pozwala bezpośrednio sterować kontrolkami z dowolnego wątku. Ale jest obejście - tzw. dispatcher. Kontrolki WPF mają coś na kształt kolejki wywołań, którymi steruje dispatcher.

Przykład:

private void cmdFollowRules_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(UpdateTextRight);
thread.Start();
}

private void UpdateTextRight()
{
// Simulate some work taking place with a five-second delay.
Thread.Sleep(TimeSpan.FromSeconds(5));
// Get the dispatcher from the current window, and use it to invoke
// the update code.
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart) delegate() {
txt.Text = "Here is some new text."; // <-- zmiana kontrolki w wątku!
}
);
}

Przykład nie mój, ale chyba pomoże :)

0

I jezeli stworzysz w watki w ktorym dales Sleep jakies kontrolki interfejsu uzytkownika to nie bedziesz mial mozliwosci ich dodac w watku glownym STA i w tym tkwi moj problem.

Podsumowujac zamiast Thread.Sleep(TimeSpan.FromSeconds(5)); powinny byc jakies operacje tworzace Canvas na ktorym rysujesz jakies linie kwadraty itd. Po utworzeniu tego obiektu Canvas nie ma mozliwosci dodac go z powrotem w watku gdzie jest glowne okno aplikacji. I wlasnie o to pytam czy ktos zna sposob na to.

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