2015-10-08 14 views
0

Код для WinForm сбой The calling thread must be STA, because many UI components require this. при попытке создать пользовательский элемент управления WPF, используя myWpfUserControl = new MyWpfUserControl();. Кажется, он сбой в конструкторе базового пользовательского элемента управления.Сбой пользовательского управления WPF с «вызывающим потоком должен быть STA»

Точка входа в мое сообщение: ApplicationStartup в App.xaml.cs, на котором есть [STAThread]. Я не использую threading вообще, и я вижу на панели Threads в Visual Studio, когда он падает, что он находится на Main Thread.

EDIT: Раньше это работало.

Вот скелет моего кода:

[STAThread] 
private void ApplicationStartup(object sender, StartupEventArgs e) 
{ 
    LogonFormEventListener listener = new LogonFormEventListener(); 
    Logon.LogonFormEvent += new Logon.ClassFormEventHandler(listener.TestEventRaised); 
    Logon logon = new Logon(); 
    logon.ShowDialog(); 
} 

public partial class Logon : Form 
{ 
    private void OKbutton_Click(object sender, EventArgs e) 
    { 
     if(LogonFormEvent !=null) LogonFormEvent(this, null); 
    } 
} 

public class LogonFormEventListener 
{ 
    public void TestEventRaised(Logon o, EventArgs e) 
    { 
     MainForm mainForm = new MainForm(); 
     mainForm.ShowDialog(); 
    } 
} 

public partial class MainForm : Form 
{ 
    MyWpfUserControl myWpfUserControl; 

    private void mainMenu_ItemClick(object sender, MenuBar.ItemEventArgs e) 
    { 
     switch (e.Item.Key) 
     { 
      case "myAction": 
       myWpfUserControl = new MyWpfUserControl(); //CRASH 
       ... 
       break; 
     } 
    } 
} 

пользовательского элемент управление происходит сбой в базе конструктора, прежде чем любой из кода в моих пробегах управления пользователем, так что нет смысла показывать контрольный код пользователя (Я думаю).

Любые идеи будут оценены.

+0

вам нужно добавить код для диагностики. –

+0

Возможно, связано с вопросом [this] (http://stackoverflow.com/questions/1361033/what-does-stathread-do). – Codor

+0

@Nikita Какой код был бы полезен? – wezten

ответ

0

Просто догадаться, но это может быть ShowDialog() на вашем TestEventRaised?

 System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => { mainForm.ShowDialog(); })); 

Возможно, по какой-то причине увольнение.

Если нет, вы можете попытаться обернуть его вокруг вызовов ShowDialog() для других конструкторов вне функции [STAThread], если когда-нибудь некоторые из них это сделают.

+0

Спасибо, но ваше прежнее предложение не сработало. Я не понимал, как это сделать. – wezten

+0

Что я имею в виду с последней частью, есть ли у вашего приложения какие-либо другие вызовы ShowDialog() за пределами тех, которые вы цитировали в своем вопросе? В частности, в экземпляре класса, где он падает. – Tyress