Это исключение означает, что поток, которому принадлежит Panel (добавляемая Panel), был инициализирован с использованием модели потоков MTA. Система перетаскивания требует, чтобы вызывающий поток использовал модель потока STA (особенно это требует, чтобы COM был инициализирован через OleInitialize). Модели многопоточности - неудачный след COM, предшественника платформы .NET.
Если у вас есть атрибут [STAThread]
в вашей основной функции, то основной поток программы уже должен быть STA. Таким образом, наиболее вероятное объяснение состоит в том, что это исключение происходит в другом потоке. Когда возникнет исключение, посмотрите на окно Threads в Visual Studio (Debug | Windows | Threads) и посмотрите, не находитесь ли вы в потоке, отличном от основного потока. Если да, решение, вероятно, так же просто, как установка модели потока для этого нового потока, что вы можете сделать следующим образом (добавьте этот код в поток, где создается элемент управления):
Thread.CurrentThread.SetApartmentState( ApartmentState.STA )
(Thread
и ApartmentState
являются членами System.Threading
)
Этот код должен произойти до того, как вы действительно запустите новый поток. Как отмечает @Tomer, вы также можете декларативно указать это, используя атрибут [STAThread]
.
Если вы обнаружите, что исключение происходит в основной ветке, отправьте сообщение назад и дайте нам знать, и, возможно, мы сможем помочь вам больше. Трассировка стека во время исключения может помочь отследить проблему.