Вызывающий stream должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого
Я использую http://www.codeproject.com/KB/IP/Facebook_API.aspx
Я пытаюсь вызвать XAML, который создается с помощью WPF . Но это дает мне ошибку:
Вызывающий stream должен быть STA, потому что для этого требуется множество компонентов пользовательского интерфейса.
Я не знаю, что делать. Я пытаюсь это сделать:
FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();
Но это дает мне эту ошибку.
Я добавил фонового работника:
static BackgroundWorker bw = new BackgroundWorker(); static void Main(string[] args) { bw.DoWork += bw_DoWork; bw.RunWorkerAsync("Message to worker"); Console.ReadLine(); } static void bw_DoWork(object sender, DoWorkEventArgs e) { // This is called on the worker thread FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); Console.WriteLine(e.Argument); // Writes "Message to worker" // Perform time-consuming task... }
- Что такого особенного в Generic.xaml?
- WinRT и региональные настройки. Правильный способ форматирования дат и чисел на основе региональных настроек пользователя?
- Как получить доступ к элементу управления внутри шаблона данных в пользовательском интерфейсе C # Metro в коде
- Как получить размер текущего экрана в WPF?
- Как прокручивать в нижней части ScrollViewer автоматически с помощью Xaml и привязки?
- Привязка видимости кнопки к значению bool в ViewModel
- Стили сплава XAML
- Обратный вызов, когда свойство зависимостей получает изменение xaml
Попробуйте вызвать код у диспетчера :
Application.Current.Dispatcher.Invoke((Action)delegate{ // your code });
Если вы делаете вызов из основного streamа, вы должны добавить атрибут STAThread к методу Main, как указано в предыдущем ответе.
Если вы используете отдельный stream, он должен быть в STA (однопоточной квартире), что не относится к streamам рабочего streamа. Вы должны сами создать stream, например:
Thread t = new Thread(ThreadProc); t.SetApartmentState(ApartmentState.STA); t.Start();
с ThreadProc является делегатом типа ThreadStart.
Я подозреваю, что вы получаете обратный вызов для компонента пользовательского интерфейса из фонового streamа. Я рекомендую вам сделать этот вызов с помощью BackgroundWorker, поскольку это stream сообщений в пользовательском интерфейсе.
Для BackgroundWorker основная программа должна быть отмечена как [STAThread].
Вы также можете попробовать это
// create a thread Thread newWindowThread = new Thread(new ThreadStart(() => { // create and show the window FaxImageLoad obj = new FaxImageLoad(destination); obj.Show(); // start the Dispatcher processing System.Windows.Threading.Dispatcher.Run(); })); // set the apartment state newWindowThread.SetApartmentState(ApartmentState.STA); // make the thread a background thread newWindowThread.IsBackground = true; // start the thread newWindowThread.Start();
Application.Current.Dispatcher.Invoke ((Action) delegate {// помещаем здесь код});
Для меня эта ошибка возникла из-за передачи пустого параметра. Проверка значений переменных исправила мою проблему без изменения кода. Я использовал BackgroundWorker.
Если вы вызываете новый оператор UI windows в существующем streamе, он выдает ошибку. Вместо этого создайте новый stream внутри основного streamа и запишите оператор windows UI в новый дочерний stream.