Firul de asteptare trebuie sa fie STA, deoarece multe componente UI necesita acest WPF

Folosesc MessageBox-ul furnizat de wpf Toolkit . Și am greșeala

Firul de asteptare trebuie sa fie STA, deoarece multe componente UI necesita aceasta </​​strong>

new Thread(new ThreadStart(delegate
{
    MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
})).Start();

Cum pot seta apartamentul în acest caz

Editați | ×: Încerc să afișez un MessageBox fără moduri folosind controlul MessageBox al wpf Toolkit. Până acum codul pe care îl am este după cum urmează:

void SomeFunction()
{
// calls to some UI, and processing and then

var th = new Thread(new ThreadStart(delegate
                                        {
                                           MessageBox.Show("Opeartion could not be completed. Please try again.",
                                                "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                                        }));

                                        th.SetApartmentState(ApartmentState.STA);
                                        th.Start();
                                    }
}
0
Motivul pentru care vreau să încep un thread nou este că, căsuța de mesaje trebuie să fie fără mod.
adăugat autor xaria, sursa
De ce începeți un fir nou doar pentru a afișa o casetă de dialog? Ar fi mult mai bine să semnați firul dvs. de interfață existentă și să îl afișați. Va rezolva automat problema.
adăugat autor Jon, sursa
wpf "> stackoverflow.com/questions/4183622/…
adăugat autor Klaus78, sursa
@ Ioan Sunt complet de acord, nu există absolut nici un motiv pentru a spin un fir nou pentru a afișa o casetă de mesaj. Chiar dacă ar fi un dialog care face ceva care ar putea bloca acel fir, încă nu aș sugera un nou fir - aș fi sugerat să folosesc Dispecerul.
adăugat autor erodewald, sursa

3 răspunsuri

EDITATE

According to MSDN There exists builtin modal MessageBox in wpf but if you want to use Modeless MessageBox then you have to create custom window and then show it. Creating, showing and and returning value from custom modeless MessageBox is not very tough. You can see this link

Nu este mai înțelept să folosiți alt fir numai pentru cutia de mesaje. Oricum puteți seta o singură stare de apartament urmând ...

  Thread th = new Thread(new ThreadStart(delegate
  {
    MessageBox.Show("Opeartion could not be completed. Please try again.", "Error",MessageBoxButtons.OK,MessageBoxImage.Error);
  }));

  th.ApartmentState = ApartmentState.STA;
  th.Start();
0
adăugat
Documentația spune că ApartmentState trebuie să fie setat înainte de threadStart. Deci, înseamnă că nu pot folosi funcția anonimă?
adăugat autor xaria, sursa
Încă mai am eroarea: o excepție nefolosită a tipului "System.InvalidOperationException" a apărut în WindowsBase.dll Informații suplimentare: Fișierul care apelează nu poate accesa acest obiect deoarece un fir diferit îl deține.
adăugat autor xaria, sursa
Consultați editarea mea
adăugat autor xaria, sursa
@ Pallob Îl primesc la declarația MessageBox.Show. Cred că utilizați System.Windows.MessageBox. Doresc să folosesc caseta de mesaje WPF. Ai încercat cu asta?
adăugat autor xaria, sursa
@xaria înainte de a începe puteți seta starea apartamentului. verificați răspunsul editat
adăugat autor Md Kamruzzaman Sarker, sursa
@ xaria obiect pe care îl utilizați? Trebuie să utilizați metoda Invoker. Afișați codul pe care îl scrieți pentru a accesa obiectul și numele și tipul obiectului (control).
adăugat autor Md Kamruzzaman Sarker, sursa
Am verificat codul pe care-l dai. Nu are nici o problemă. Fugi pe mine fără nici o eroare. Știți ce linie de cod dă eroarea și apoi dați acea linie de cod. Cred că dă eroare în această privință//apelurile către un UI și procesarea și apoi
adăugat autor Md Kamruzzaman Sarker, sursa
@CodingBarfield: Și cum ar face ca firul lui nou să fie în STA?
adăugat autor Grzegorz W, sursa
Amintiți-vă că puteți seta FlatState o singură dată pentru fiecare fir. L-aș seta setând: [STAThread] void static public Main ()
adăugat autor CodingBarfield, sursa

Asemenea cadrelor interfeței cu utilizatorul, la fel ca multe Windows Forms, wpf impune și un singur model de filetare, ceea ce înseamnă că puteți accesa doar un thread specific al derivatului DispatcherObject care îl creează. În controalele Windows Forms, care implementează interfața ISynchronizeInvoke, această interfață expune un set de metode precum Invoke și BeginInvoke pentru a impune o sincronizare fir de fir comună pe care o putem folosi pentru a accesa un control dintr-un alt fir. În WPF, avem de asemenea un astfel de lucru, dar aceste operațiuni sunt implicate într-o clasă numită Dispecer, Dispecerul wpf este modul în care se permite acest tip de model de sincronizare a firului.

Următorul este un exemplu de modificare a proprietății TextBox.Text atunci când apelantul se află într-un thread diferit:

// Resets textbox text from another thread
textBox.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
    textBox.Text = "New text";
}));
0
adăugat
// enable unit test to mock a dispatcher
var dispatcher = Dispatcher.CurrentDispatcher;
if (Application.Current != null)
{
   //use the application dispatcher if running from the software
    dispatcher = Application.Current.Dispatcher;
}

if (dispatcher != null)
{
   //delegate the operation to UI thread.
    dispatcher.Invoke(
        delegate
        {
            MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
        });
}
0
adăugat